diff --git a/crates/amalthea/src/comm/data_explorer_comm.rs b/crates/amalthea/src/comm/data_explorer_comm.rs index e8c83af44..708ab0f2f 100644 --- a/crates/amalthea/src/comm/data_explorer_comm.rs +++ b/crates/amalthea/src/comm/data_explorer_comm.rs @@ -38,6 +38,20 @@ pub struct ExportedData { pub format: ExportFormat } +/// Code snippet for the data view +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct ConvertedCode { + /// Lines of code that implement filters and sort keys + pub converted_code: Vec +} + +/// Syntax to use for code conversion +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct CodeSyntaxName { + /// The name of the code syntax, eg, pandas, polars, dplyr, etc. + pub code_syntax_name: String +} + /// The result of applying filters to a table #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct FilterResult { @@ -537,7 +551,10 @@ pub struct SupportedFeatures { pub set_sort_columns: SetSortColumnsFeatures, /// Support for 'export_data_selection' RPC and its features - pub export_data_selection: ExportDataSelectionFeatures + pub export_data_selection: ExportDataSelectionFeatures, + + /// Support for 'convert_to_code' RPC and its features + pub convert_to_code: ConvertToCodeFeatures } /// Feature flags for 'search_schema' RPC @@ -600,6 +617,16 @@ pub struct SetSortColumnsFeatures { pub support_status: SupportStatus } +/// Feature flags for convert to code RPC +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct ConvertToCodeFeatures { + /// The support status for this RPC method + pub support_status: SupportStatus, + + /// The syntaxes for converted code + pub code_syntaxes: Option> +} + /// A selection on the data grid, for copying to the clipboard or other /// actions #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] @@ -1073,6 +1100,22 @@ pub struct ExportDataSelectionParams { pub format: ExportFormat, } +/// Parameters for the ConvertToCode method. +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct ConvertToCodeParams { + /// Zero or more column filters to apply + pub column_filters: Vec, + + /// Zero or more row filters to apply + pub row_filters: Vec, + + /// Zero or more sort keys to apply + pub sort_keys: Vec, + + /// The code syntax to use for conversion + pub code_syntax_name: CodeSyntaxName, +} + /// Parameters for the SetColumnFilters method. #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct SetColumnFiltersParams { @@ -1164,6 +1207,20 @@ pub enum DataExplorerBackendRequest { #[serde(rename = "export_data_selection")] ExportDataSelection(ExportDataSelectionParams), + /// Converts the current data view into a code snippet. + /// + /// Converts filters and sort keys as code in different syntaxes like + /// pandas, polars, data.table, dplyr + #[serde(rename = "convert_to_code")] + ConvertToCode(ConvertToCodeParams), + + /// Suggest code syntax for code conversion + /// + /// Suggest code syntax for code conversion based on the current backend + /// state + #[serde(rename = "suggest_code_syntax")] + SuggestCodeSyntax, + /// Set column filters to select subset of table columns /// /// Set or clear column filters on table, replacing any previous filters @@ -1220,6 +1277,12 @@ pub enum DataExplorerBackendReply { /// Exported result ExportDataSelectionReply(ExportedData), + /// Code snippet for the data view + ConvertToCodeReply(ConvertedCode), + + /// Syntax to use for code conversion + SuggestCodeSyntaxReply(CodeSyntaxName), + /// Reply for the set_column_filters method (no result) SetColumnFiltersReply(), diff --git a/crates/ark/src/data_explorer/r_data_explorer.rs b/crates/ark/src/data_explorer/r_data_explorer.rs index 48549fe74..6cf4f0087 100644 --- a/crates/ark/src/data_explorer/r_data_explorer.rs +++ b/crates/ark/src/data_explorer/r_data_explorer.rs @@ -11,6 +11,7 @@ use std::collections::HashMap; use amalthea::comm::comm_channel::CommMsg; use amalthea::comm::data_explorer_comm::ArraySelection; use amalthea::comm::data_explorer_comm::BackendState; +use amalthea::comm::data_explorer_comm::CodeSyntaxName; use amalthea::comm::data_explorer_comm::ColumnDisplayType; use amalthea::comm::data_explorer_comm::ColumnFilter; use amalthea::comm::data_explorer_comm::ColumnProfileType; @@ -19,6 +20,8 @@ use amalthea::comm::data_explorer_comm::ColumnSchema; use amalthea::comm::data_explorer_comm::ColumnSelection; use amalthea::comm::data_explorer_comm::ColumnSortKey; use amalthea::comm::data_explorer_comm::ColumnValue; +use amalthea::comm::data_explorer_comm::ConvertToCodeFeatures; +use amalthea::comm::data_explorer_comm::ConvertedCode; use amalthea::comm::data_explorer_comm::DataExplorerBackendReply; use amalthea::comm::data_explorer_comm::DataExplorerBackendRequest; use amalthea::comm::data_explorer_comm::DataExplorerFrontendEvent; @@ -556,6 +559,16 @@ impl RDataExplorer { format, }, )), + DataExplorerBackendRequest::ConvertToCode(_) => Ok( + DataExplorerBackendReply::ConvertToCodeReply(ConvertedCode { + converted_code: vec!["not yet implemented".to_string()], + }), + ), + DataExplorerBackendRequest::SuggestCodeSyntax => Ok( + DataExplorerBackendReply::SuggestCodeSyntaxReply(CodeSyntaxName { + code_syntax_name: "base".into(), + }), + ), } } } @@ -981,6 +994,20 @@ impl RDataExplorer { ExportFormat::Html, ], }, + convert_to_code: ConvertToCodeFeatures { + support_status: SupportStatus::Supported, + code_syntaxes: Some(vec![ + CodeSyntaxName { + code_syntax_name: "base".into(), + }, + CodeSyntaxName { + code_syntax_name: "data.table".into(), + }, + CodeSyntaxName { + code_syntax_name: "dplyr".into(), + }, + ]), + }, }, }; Ok(DataExplorerBackendReply::GetStateReply(state))