No user-facing changes but should enable implementing non-file URIs and more complex queries such as "state in a particular channel" or "state with a given set of hashes".
NEAR63OCPUGLXZ46YRBBY5DI5LCVH27XNGGZD7LCMUESHON54JFQC }pub fn to_vscode<'env>(env: &'env napi::Env,uri: &UriAbsoluteStr,) -> Result<vscode_sys::Uri<'env>, napi::Error> {vscode_sys::Uri::parse(env, uri.as_str(), true)}pub fn encode(vscode_uri: &vscode_sys::Uri) -> Result<UriAbsoluteString, napi::Error> {let uri_to_encode = vscode_uri.to_string_skip_encoding(true)?;let encoded_path = format!("/{}", URL_SAFE.encode(uri_to_encode));let mut builder = iri_string::build::Builder::new();builder.scheme(crate::PIJUL_SCHEME);// TODO: support different hosts with different actionsbuilder.host("tracked");builder.path(&encoded_path);builder.normalize();let built_uri = builder.build().map_err(|error| napi::Error::from_reason(format!("Failed to build URI: {error}")))?;Ok(UriAbsoluteString::from(built_uri))}pub fn decode(vscode_uri: &vscode_sys::Uri) -> Result<UriAbsoluteString, napi::Error> {// Example: pijul:tracked/dnNjb2RlOmV4YW1wbGUvdXJplet pijul_uri = from_vscode(vscode_uri)?;// Example: dnNjb2RlOmV4YW1wbGUvdXJplet uri_to_decode = pijul_uri.path_str().strip_prefix('/').ok_or_else(|| {napi::Error::from_reason(format!("URI path did not contain `/`: {pijul_uri}"))})?;let decoded_bytes = URL_SAFE.decode(uri_to_decode).map_err(|error| {napi::Error::from_reason(format!("Failed to decode base64 bytes: {error}"))})?;// Example: vscode:example/urilet decoded_text = String::from_utf8(decoded_bytes).map_err(|error| {napi::Error::from_reason(format!("Failed to parse UTF-8 bytes: {error}"))})?;UriAbsoluteString::try_from(decoded_text).map_err(|error| napi::Error::from_reason(format!("Failed to parse decoded URI: {error}")))
let uri_change = vscode_sys::UriWithChange::new(env)?.scheme("file")?;let uri = pijul_uri.with(uri_change)?;
// Example: pijul:tracked/dnNjb2RlOmV4YW1wbGUvdXJp -> vscode:example/urilet decoded_uri = uri::decode(&encoded_uri)?;let uri = uri::to_vscode(env, &decoded_uri)?;
// TODO: create a proper uri that preserves everything, including the original schemelet uri_change = vscode_sys::UriWithChange::new(env)?.scheme(PIJUL_SCHEME)?;let pijul_uri = uri.with(uri_change)?;
// Encode the original URI as part of a Pijul URI// Example: vscode:example/uri -> pijul:tracked/dnNjb2RlOmV4YW1wbGUvdXJplet encoded_uri = uri::encode(&uri_to_encode)?;let vscode_uri = uri::to_vscode(env, &encoded_uri)?;