Implement base64 URI encoding/decoding for Pijul URIs
Dependencies
- [2]
WFWTKCJNCreate initial Visual Studio Code extension - [3]
72K45XKDRefactor inline credit to improve hover messages - [4]
POA32CUWAdd `uri` module - [5]
3RNQI5RXRefactor `provide_file_decoration` to return a `Promise` resolved by `event_loop` - [6]
TWPZLEGDReturn correct file contents for quick diff - [7]
6AUGQLIKAdd basic panic handling
Change contents
- edit in editors/vscode/src/vscode_sys/mod.rs at line 159
) -> Uri<'env>;"parse":parse(value: &str,strict: bool, - replacement in editors/vscode/src/uri.rs at line 1
use iri_string::types::UriAbsoluteString;use base64::{Engine, engine::general_purpose::URL_SAFE};use iri_string::types::{UriAbsoluteStr, UriAbsoluteString}; - edit in editors/vscode/src/uri.rs at line 11
}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}"))) - edit in editors/vscode/src/lib.rs at line 70
#[tracing::instrument(skip_all)] - replacement in editors/vscode/src/lib.rs at line 73
pijul_uri: vscode_sys::Uri,encoded_uri: vscode_sys::Uri, - replacement in editors/vscode/src/lib.rs at line 78
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)?; - replacement in editors/vscode/src/lib.rs at line 114
uri: vscode_sys::Uri<'env>,uri_to_encode: vscode_sys::Uri<'env>, - replacement in editors/vscode/src/lib.rs at line 117
// 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)?; - replacement in editors/vscode/src/lib.rs at line 122
Ok(Some(pijul_uri))// TODO: only return `Some()` when the uri exists in the repositoryOk(Some(vscode_uri)) - edit in editors/vscode/Cargo.toml at line 22
base64.workspace = true - edit in Cargo.toml at line 26
base64 = "0.22" - edit in Cargo.lock at line 2591
"base64",