treease-cli 1.2.0

Command-line interface for querying, transforming, and previewing structured documents with Treease
Documentation
use std::io;

use treease_core::core::CoreError;

#[derive(Debug, Clone)]
pub(crate) struct ParsedArgs {
    pub(crate) command: CommandKind,
    pub(crate) expression: String,
    pub(crate) files: Vec<String>,
    pub(crate) help: bool,
    pub(crate) null_input: bool,
    pub(crate) exit_status: bool,
    pub(crate) input_format: Option<String>,
    pub(crate) output_format: Option<String>,
    pub(crate) pretty_print: Option<bool>,
    pub(crate) indent: Option<i32>,
    pub(crate) unwrap_scalar: bool,
    pub(crate) no_doc: bool,
    pub(crate) inplace: bool,
    pub(crate) metadata_format: Option<String>,
    pub(crate) metadata_target: Option<String>,
    pub(crate) metadata_category: Option<String>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum CommandKind {
    Run,
    Web,
    Help,
    OperatorsList,
    OperatorsGet,
    OperatorsSearch,
    FormatsList,
    FormatsGet,
}

impl Default for ParsedArgs {
    fn default() -> Self {
        Self {
            command: CommandKind::Run,
            expression: ".".to_string(),
            files: Vec::new(),
            help: false,
            null_input: false,
            exit_status: false,
            input_format: None,
            output_format: None,
            pretty_print: None,
            indent: None,
            unwrap_scalar: false,
            no_doc: false,
            inplace: false,
            metadata_format: None,
            metadata_target: None,
            metadata_category: None,
        }
    }
}

#[derive(Debug)]
pub(crate) enum CliError {
    #[allow(dead_code)]
    MissingValue(&'static str),
    InvalidIndent(String),
    UnsupportedFormat(String),
    UnsupportedOperator(String),
    InvalidFlagCombination,
    MultipleInputFiles,
    MultipleInputFilesForInplace,
    UnsupportedWebFlag(&'static str),
    InvalidWebInputCount,
    WebAssetDownload(String),
    WebAssetManifest(String),
    WebAssetCache(String),
    #[allow(dead_code)]
    WebServer(String),
    #[allow(dead_code)]
    WebForbidden,
    UnknownCommand(String),
    UnknownFlag(String),
    Eval(String),
    Io(io::Error),
    Core(CoreError),
}

impl From<io::Error> for CliError {
    fn from(value: io::Error) -> Self {
        Self::Io(value)
    }
}

impl From<CoreError> for CliError {
    fn from(value: CoreError) -> Self {
        Self::Core(value)
    }
}

#[derive(Debug, Clone)]
pub(crate) struct InputPayload {
    pub(crate) name: String,
    pub(crate) bytes: Vec<u8>,
}

impl InputPayload {
    pub(crate) fn display_name(&self) -> &str {
        &self.name
    }
}

#[derive(Debug, Clone)]
pub(crate) struct StreamingInput {
    pub(crate) name: String,
    pub(crate) input_format: String,
    pub(crate) source: StreamingInputSource,
}

#[derive(Debug, Clone)]
pub(crate) enum StreamingInputSource {
    Stdin(Vec<u8>),
    FilePath(String),
}

impl StreamingInput {
    pub(crate) fn display_name(&self) -> &str {
        &self.name
    }
}