diff --git a/crates/amalthea/src/comm/data_explorer_comm.rs b/crates/amalthea/src/comm/data_explorer_comm.rs index cac273cac..b5179f14d 100644 --- a/crates/amalthea/src/comm/data_explorer_comm.rs +++ b/crates/amalthea/src/comm/data_explorer_comm.rs @@ -706,7 +706,7 @@ pub enum SearchSchemaSortOrder { } /// Possible values for ColumnDisplayType -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum ColumnDisplayType { #[serde(rename = "number")] #[strum(to_string = "number")] @@ -754,7 +754,7 @@ pub enum ColumnDisplayType { } /// Possible values for Condition in RowFilter -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum RowFilterCondition { #[serde(rename = "and")] #[strum(to_string = "and")] @@ -766,7 +766,7 @@ pub enum RowFilterCondition { } /// Possible values for RowFilterType -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum RowFilterType { #[serde(rename = "between")] #[strum(to_string = "between")] @@ -814,7 +814,7 @@ pub enum RowFilterType { } /// Possible values for Op in FilterComparison -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum FilterComparisonOp { #[serde(rename = "=")] #[strum(to_string = "=")] @@ -842,7 +842,7 @@ pub enum FilterComparisonOp { } /// Possible values for TextSearchType -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum TextSearchType { #[serde(rename = "contains")] #[strum(to_string = "contains")] @@ -866,7 +866,7 @@ pub enum TextSearchType { } /// Possible values for ColumnFilterType -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum ColumnFilterType { #[serde(rename = "text_search")] #[strum(to_string = "text_search")] @@ -878,7 +878,7 @@ pub enum ColumnFilterType { } /// Possible values for ColumnProfileType -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum ColumnProfileType { #[serde(rename = "null_count")] #[strum(to_string = "null_count")] @@ -906,7 +906,7 @@ pub enum ColumnProfileType { } /// Possible values for Method in ColumnHistogramParams -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum ColumnHistogramParamsMethod { #[serde(rename = "sturges")] #[strum(to_string = "sturges")] @@ -926,7 +926,7 @@ pub enum ColumnHistogramParamsMethod { } /// Possible values for Kind in TableSelection -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum TableSelectionKind { #[serde(rename = "single_cell")] #[strum(to_string = "single_cell")] @@ -954,7 +954,7 @@ pub enum TableSelectionKind { } /// Possible values for ExportFormat -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum ExportFormat { #[serde(rename = "csv")] #[strum(to_string = "csv")] @@ -970,7 +970,7 @@ pub enum ExportFormat { } /// Possible values for SupportStatus -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum SupportStatus { #[serde(rename = "unsupported")] #[strum(to_string = "unsupported")] diff --git a/crates/amalthea/src/comm/help_comm.rs b/crates/amalthea/src/comm/help_comm.rs index b6068d3e3..387324045 100644 --- a/crates/amalthea/src/comm/help_comm.rs +++ b/crates/amalthea/src/comm/help_comm.rs @@ -12,7 +12,7 @@ use serde::Deserialize; use serde::Serialize; /// Possible values for Kind in ShowHelp -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum ShowHelpKind { #[serde(rename = "html")] #[strum(to_string = "html")] diff --git a/crates/amalthea/src/comm/plot_comm.rs b/crates/amalthea/src/comm/plot_comm.rs index 7387ebc69..8a281877a 100644 --- a/crates/amalthea/src/comm/plot_comm.rs +++ b/crates/amalthea/src/comm/plot_comm.rs @@ -64,7 +64,7 @@ pub struct PlotRenderSettings { } /// Possible values for PlotUnit -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum PlotUnit { #[serde(rename = "pixels")] #[strum(to_string = "pixels")] @@ -76,7 +76,7 @@ pub enum PlotUnit { } /// Possible values for PlotRenderFormat -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] pub enum PlotRenderFormat { #[serde(rename = "png")] #[strum(to_string = "png")] diff --git a/crates/amalthea/src/comm/ui_comm.rs b/crates/amalthea/src/comm/ui_comm.rs index 01a1256b9..cef39ff3e 100644 --- a/crates/amalthea/src/comm/ui_comm.rs +++ b/crates/amalthea/src/comm/ui_comm.rs @@ -98,6 +98,18 @@ pub struct Range { pub end: Position } +/// Possible values for Kind in OpenEditor +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, strum_macros::Display, strum_macros::EnumString)] +pub enum OpenEditorKind { + #[serde(rename = "path")] + #[strum(to_string = "path")] + Path, + + #[serde(rename = "uri")] + #[strum(to_string = "uri")] + Uri +} + /// Parameters for the DidChangePlotsRenderSettings method. #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct DidChangePlotsRenderSettingsParams { @@ -133,6 +145,10 @@ pub struct OpenEditorParams { /// The column number to jump to pub column: i64, + + /// How to interpret the 'file' argument: as a file path or as a URI. If + /// omitted, defaults to 'path'. + pub kind: OpenEditorKind, } /// Parameters for the NewDocument method. diff --git a/crates/ark/src/modules/positron/frontend-methods.R b/crates/ark/src/modules/positron/frontend-methods.R index 50575dedf..6af703e3e 100644 --- a/crates/ark/src/modules/positron/frontend-methods.R +++ b/crates/ark/src/modules/positron/frontend-methods.R @@ -39,7 +39,10 @@ column = 0L ) { # Don't normalize if that's an `ark:` URI - if (!grepl("^ark:", file)) { + if (grepl("^ark:", file)) { + kind <- "uri" + } else { + kind <- "path" file <- normalizePath(file) } @@ -51,7 +54,7 @@ column <- 0L } - .ps.Call("ps_ui_navigate_to_file", file, line, column) + .ps.Call("ps_ui_navigate_to_file", file, line, column, kind) } #' @export diff --git a/crates/ark/src/ui/events.rs b/crates/ark/src/ui/events.rs index 97efee245..9aa47f96f 100644 --- a/crates/ark/src/ui/events.rs +++ b/crates/ark/src/ui/events.rs @@ -5,6 +5,9 @@ // // +use std::str::FromStr; + +use amalthea::comm::ui_comm::OpenEditorKind; use amalthea::comm::ui_comm::OpenEditorParams; use amalthea::comm::ui_comm::OpenWithSystemParams; use amalthea::comm::ui_comm::OpenWorkspaceParams; @@ -63,11 +66,16 @@ pub unsafe extern "C-unwind" fn ps_ui_navigate_to_file( file: SEXP, line: SEXP, column: SEXP, + uri: SEXP, ) -> anyhow::Result { + let kind: String = RObject::view(uri).try_into()?; + let kind = OpenEditorKind::from_str(&kind)?; + let params = OpenEditorParams { file: RObject::view(file).try_into()?, line: RObject::view(line).try_into()?, column: RObject::view(column).try_into()?, + kind, }; let event = UiFrontendEvent::OpenEditor(params);