netsky 0.2.0

netsky CLI: the viable system launcher and subcommand dispatcher
Documentation
use clap::Subcommand;

#[derive(Subcommand, Debug)]
#[command(subcommand_required = true, arg_required_else_help = true)]
pub enum CalendarCommand {
    #[command(name = "ls", visible_alias = "list")]
    List,
    Events {
        account: String,
        #[arg(long = "from")]
        from_ts: Option<String>,
        #[arg(long = "to")]
        to_ts: Option<String>,
    },
    Get {
        composite: String,
    },
    Add {
        account: String,
        #[arg(long)]
        summary: String,
        #[arg(long)]
        start: String,
        #[arg(long)]
        end: String,
    },
    Rm {
        composite: String,
    },
}

pub fn run(cmd: CalendarCommand) -> netsky_core::Result<()> {
    match cmd {
        CalendarCommand::List => print_json(netsky_channels::calendar::ops::list_calendars())?,
        CalendarCommand::Events {
            account,
            from_ts,
            to_ts,
        } => print_json(netsky_channels::calendar::ops::list_events(
            &account,
            from_ts.as_deref(),
            to_ts.as_deref(),
            None,
            None,
        ))?,
        CalendarCommand::Get { composite } => {
            print_json(netsky_channels::calendar::ops::get_event(&composite))?
        }
        CalendarCommand::Add {
            account,
            summary,
            start,
            end,
        } => {
            let id = netsky_channels::calendar::ops::create_event(
                &account, &summary, &start, &end, None, None,
            )
            .map_err(|e| netsky_core::Error::Message(e.to_string()))?;
            println!("created: {id}");
        }
        CalendarCommand::Rm { composite } => {
            netsky_channels::calendar::ops::delete_event(&composite)
                .map_err(|e| netsky_core::Error::Message(e.to_string()))?;
            println!("deleted: {composite}");
        }
    }
    Ok(())
}

fn print_json<T: serde::Serialize>(value: anyhow::Result<T>) -> netsky_core::Result<()> {
    let value = value.map_err(|e| netsky_core::Error::Message(e.to_string()))?;
    println!(
        "{}",
        serde_json::to_string_pretty(&value)
            .map_err(|e| netsky_core::Error::Message(e.to_string()))?
    );
    Ok(())
}