Add `RequestTrackedContents` event
Dependencies
- [2]
WFWTKCJNCreate initial Visual Studio Code extension - [3]
TWPZLEGDReturn correct file contents for quick diff - [4]
NB2MF3MYAdd `OpenWorkspaceFolder` event - [5]
2ZAM5V35Move event handling into modules - [6]
IDY5SNLOUpdate source control resource states in event loop - [7]
D3V6U7N6Use untyped promises as return value for `FileDecorationProvider` - [8]
3RNQI5RXRefactor `provide_file_decoration` to return a `Promise` resolved by `event_loop` - [9]
M5RW5PN4Add `OpenTextEditor` event - [10]
POA32CUWAdd `uri` module - [11]
NEAR63OCImplement base64 URI encoding/decoding for Pijul URIs - [12]
M2NAH3DCStore modified time of `FileContents` as `jiff::Timestamp` - [*]
3YGYMEXVCreate `event_loop` module
Change contents
- replacement in editors/vscode/src/vscode_sys/mod.rs at line 327
) -> Option<String>;) -> bindgen_prelude::Object<'function_context>; - replacement in editors/vscode/src/vscode_sys/mod.rs at line 336
) -> Option<String>;) -> bindgen_prelude::Object<'function_context>; - replacement in editors/vscode/src/vscode_sys/mod.rs at line 338
Option<String> = |returned_result: Option<String>| Ok(returned_result);bindgen_prelude::ObjectRef = |returned_result: bindgen_prelude::Object| returned_result.create_ref(); - edit in editors/vscode/src/lib.rs at line 59
let (deferred_promise, promise_object) = env.create_deferred()?; - edit in editors/vscode/src/lib.rs at line 61
let (deferred_promise, promise_object) = env.create_deferred()?; - replacement in editors/vscode/src/lib.rs at line 71
fn provide_text_document_content(env: &napi::Env,fn provide_text_document_content<'env>(env: &'env napi::Env, - replacement in editors/vscode/src/lib.rs at line 75
) -> Result<Option<String>, napi::Error> {let program_state = ExtensionState::get()?;) -> Result<bindgen_prelude::Object<'env>, napi::Error> { - edit in editors/vscode/src/lib.rs at line 78
let uri = uri::to_vscode(env, &decoded_uri)?; - replacement in editors/vscode/src/lib.rs at line 79[2.112379]→[2.112379:112927](∅→∅),[2.112927]→[3.157:242](∅→∅),[3.242]→[2.112998:113183](∅→∅),[2.112998]→[2.112998:113183](∅→∅)
if let Some((workspace_path, workspace)) =program_state.repositories.get_open_repository(env, &uri)?{let absolute_path = Utf8PathBuf::from(uri.get_fs_path()?);let relative_path = absolute_path.strip_prefix(&workspace_path).map_err(|error| {napi::Error::from_reason(format!("Failed to strip prefix {workspace_path} from {absolute_path}: {error}"))})?;match workspace.repository.get_open_file(relative_path) {Some(open_file) => Ok(open_file.tracked_contents().map(str::to_string)),None => {tracing::error!(message = "No tracked file state for {relative_path}",?workspace_path);let (deferred_promise, promise_object) = env.create_deferred()?;event_loop::send(Event::RequestTrackedContents {uri: decoded_uri,deferred_promise,}); - replacement in editors/vscode/src/lib.rs at line 85[2.113184]→[2.113184:113246](∅→∅),[2.113246]→[2.113246:113321](∅→∅),[2.113321]→[2.113321:113345](∅→∅)
Ok(None)}}} else {tracing::debug!(message = "Ignoring URI", uri = uri.to_string()?);Ok(None)}Ok(promise_object) - edit in editors/vscode/src/lib.rs at line 98
// TODO: only return `Some()` when the uri exists in the repository - edit in editors/vscode/src/event_loop/mod.rs at line 130
Event::RequestTrackedContents {uri,deferred_promise,} => {event::request_tracked_contents::handle(uri, deferred_promise, &extension_state).await} - file addition: request_tracked_contents.rs[5.332]
use iri_string::types::{UriAbsoluteStr, UriAbsoluteString};use crate::event_loop::ExtensionState;pub type DeferredPromise = napi::JsDeferred<Option<String>,Box<dyn FnOnce(napi::Env) -> Result<Option<String>, napi::Error>>,>;#[tracing::instrument(skip(deferred_promise, extension_state))]pub async fn handle(uri: UriAbsoluteString,deferred_promise: DeferredPromise,extension_state: &ExtensionState,) {let tracked_contents = get_tracked_contents(&uri, extension_state);tracing::info!(message = "Providing tracked contents",length = ?tracked_contents.as_ref().map(|contents| contents.len()));deferred_promise.resolve(Box::new(move |_env| Ok(tracked_contents)));}#[tracing::instrument(skip(extension_state))]fn get_tracked_contents(uri: &UriAbsoluteStr, extension_state: &ExtensionState) -> Option<String> {let Some((repository_path, relative_path, repository)) = extension_state.get_repository(uri)else {tracing::info!(message = "No matching repository for path", ?uri);return None;};let Some(open_file) = repository.repository.get_open_file(relative_path) else {tracing::info!(message = "No open file found in repository",?repository_path,?relative_path);return None;};let Some(tracked_contents) = open_file.tracked_contents() else {tracing::info!(message = "No tracked contents for file",?repository_path,?relative_path);return None;};Some(tracked_contents.to_string())} - edit in editors/vscode/src/event_loop/event/request_file_decoration.rs at line 24
tracing::debug!(message = "Providing file decoration", ?optional_path_state); - edit in editors/vscode/src/event_loop/event/request_file_decoration.rs at line 54
#[tracing::instrument(skip(extension_state))] - edit in editors/vscode/src/event_loop/event/request_file_decoration.rs at line 56
if uri.scheme_str() != "file" {return None;} - replacement in editors/vscode/src/event_loop/event/request_file_decoration.rs at line 58
tracing::info!(message = "No matching repository for path", ?uri);tracing::info!(message = "No matching repository for path"); - edit in editors/vscode/src/event_loop/event/mod.rs at line 10
pub mod request_tracked_contents; - edit in editors/vscode/src/event_loop/event/mod.rs at line 32
RequestTrackedContents {uri: UriAbsoluteString,deferred_promise: request_tracked_contents::DeferredPromise,},