#[cfg(feature = "json")]
use serde::Serialize;
#[derive(Debug, Clone)]
#[cfg_attr(feature = "json", derive(Serialize))]
pub struct CommandSpec {
pub name: &'static str,
pub description: &'static str,
pub syntax: &'static str,
pub arguments: &'static [ArgumentSpec], }
#[derive(Debug, Clone)]
#[cfg_attr(feature = "json", derive(Serialize))]
pub struct ArgumentSpec {
pub name: &'static str,
pub description: &'static str,
pub required: bool,
}
pub static SPECS: &[CommandSpec] = &[
CommandSpec {
name: "combine",
description: "Combines multiple numerical data series into a single series by averaging.",
syntax: "combine <series_1_path_or_data> <series_2_path_or_data> ... <series_n_path_or_data>",
arguments: &[
ArgumentSpec { name: "<series_data>", description: "Path to a data file or direct numerical data for a series. At least two series are required.", required: true },
],
},
CommandSpec {
name: "predict",
description: "Predicts the next numeric value based on linear extrapolation (2*last - second_last)",
syntax: "predict <number1> <number2> ... <numberN>",
arguments: &[
ArgumentSpec {
name: "<numbers>",
description: "A series of numbers. At least two numbers are required for prediction.",
required: true,
},
],
},
CommandSpec {
name: "show",
description: "Displays the logged commands and their outputs from the current session.",
syntax: "show",
arguments: &[],
},
CommandSpec {
name: "help",
description: "Displays this help message or detailed information about commands.",
syntax: "help [command_name] [--json]",
arguments: &[
ArgumentSpec { name: "[command_name]", description: "Optional: The name of a command to get detailed help for.", required: false },
ArgumentSpec { name: "--json", description: "Optional: Output the help information in JSON format.", required: false },
],
},
CommandSpec {
name: "select",
description: "Selects specific columns from a dataset.",
syntax: "select <column1> [column2] ... [columnN]",
arguments: &[
ArgumentSpec { name: "<columns>", description: "Columns to select from the dataset.", required: true },
],
},
CommandSpec {
name: "filter",
description: "Filters rows in a dataset based on a condition.",
syntax: "filter <condition>",
arguments: &[
ArgumentSpec { name: "<condition>", description: "Condition to filter rows (e.g., 'age > 30').", required: true },
],
},
CommandSpec {
name: "group",
description: "Groups data by specified columns for aggregation.",
syntax: "group <column1> [column2] ... [columnN]",
arguments: &[
ArgumentSpec { name: "<columns>", description: "Columns to group by.", required: true },
],
},
CommandSpec {
name: "join",
description: "Joins two datasets based on a common key or condition.",
syntax: "join <dataset1> <dataset2> <join_condition>",
arguments: &[
ArgumentSpec { name: "<dataset1>", description: "First dataset to join.", required: true },
ArgumentSpec { name: "<dataset2>", description: "Second dataset to join.", required: true },
ArgumentSpec { name: "<join_condition>", description: "Condition or key to join datasets (e.g., 'id = id').", required: true },
],
},
CommandSpec {
name: "sort",
description: "Sorts the dataset based on specified columns.",
syntax: "sort <column1> [column2] ... [columnN] [order]",
arguments: &[
ArgumentSpec { name: "<columns>", description: "Columns to sort by.", required: true },
ArgumentSpec { name: "[order]", description: "Optional: Sort order ('asc' or 'desc'). Default is 'asc'.", required: false },
],
},
CommandSpec {
name: "load",
description: "Loads data from a file or source into a DuckDB table.",
syntax: "load <file_path_or_source> [table_name]",
arguments: &[
ArgumentSpec { name: "<file_path_or_source>", description: "Path to the file or data source to load.", required: true },
ArgumentSpec { name: "[table_name]", description: "Optional: Name of the table to create. Defaults to 'loaded_data'.", required: false },
],
},
CommandSpec {
name: "sql",
description: "Executes a direct SQL query.",
syntax: "sql <query>",
arguments: &[
ArgumentSpec { name: "<query>", description: "SQL query to execute.", required: true },
],
},
];
#[cfg(feature = "json")]
pub fn get_specs_json() -> Result<String, serde_json::Error> {
serde_json::to_string_pretty(&SPECS)
}