//! The undo CLI selects journal entries through the reserved host HTTP API. use clap::Parser; #[derive(Parser)] struct Args { /// A tag, or the list/show command. #[arg(required_unless_present = "since")] action: Option, #[arg(required_if_eq("action", "show"))] tag: Option, #[arg(long)] conversation: Option, #[arg(long, conflicts_with = "action")] since: Option, #[arg(long)] force: bool, } fn main() { let args = Args::parse(); let mut url = url::Url::parse("http://host.sausage/undo").unwrap(); let mut transfer = vec!["undo-http".to_owned()]; match args.action.as_deref() { Some("list") => { if let Some(conversation) = args.conversation { url.query_pairs_mut() .append_pair("conversation", &conversation); } } Some("show") => { let tag = args.tag.expect("required show tag"); url.set_path("/undo/show"); url.query_pairs_mut().append_pair("tag", &tag); } tag => { let body = serde_json::json!({"tag":tag,"since":args.since,"force":args.force}); transfer.extend(["--json".into(), body.to_string()]); } } transfer.extend(["--fail-with-body".into(), url.to_string()]); let mut request = curl::Args::parse_from(transfer); request.parts = request.json.iter().map(|s| (s.clone(), 3)).collect(); if let Err(error) = curl::run(&request) { eprintln!("undo: {}", error.message); std::process::exit(error.code); } }