flowcode-core 0.4.3-alpha

Core execution engine for FlowCode data scripting language
Documentation
#[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], // New field for argument details
}

#[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 },
        ],
    },
    // Future commands like 'clear', 'exit' (if they become true commands) would go here.
];

// Helper function to get SPECS as JSON, requires 'json' feature
#[cfg(feature = "json")]
pub fn get_specs_json() -> Result<String, serde_json::Error> {
    serde_json::to_string_pretty(&SPECS)
}