grex_cli/cli/verbs/
add.rs1use crate::cli::args::{AddArgs, GlobalFlags};
2use anyhow::{Context, Result};
3use grex_core::add::{add_pack, infer_path_from_url, AddOpts, AddReport, AddRequest};
4use grex_core::import::classify;
5use tokio_util::sync::CancellationToken;
6
7pub fn run(args: AddArgs, global: &GlobalFlags, _cancel: &CancellationToken) -> Result<()> {
8 let path = args.path.unwrap_or_else(|| infer_path_from_url(&args.url));
9 let pack_type = classify(&args.url).as_str().to_string();
10 let manifest = std::env::current_dir().unwrap_or_default().join("grex.jsonl");
11 let report = add_pack(
12 &manifest,
13 AddRequest::new(args.url, path, pack_type),
14 AddOpts::new(global.dry_run),
15 )
16 .context("grex add failed")?;
17
18 if global.json {
19 emit_json(&report)?;
20 } else {
21 emit_human(&report);
22 }
23 Ok(())
24}
25
26fn emit_human(report: &AddReport) {
27 let prefix = if report.dry_run { "DRY-RUN: would add" } else { "added" };
28 println!(
29 "{prefix} {path:<32} {kind:<12} {url}",
30 path = report.path,
31 kind = report.pack_type,
32 url = if report.url.is_empty() { "-" } else { &report.url },
33 );
34}
35
36fn emit_json(report: &AddReport) -> Result<()> {
37 let out = serde_json::json!({
38 "dry_run": report.dry_run,
39 "id": report.id,
40 "url": report.url,
41 "path": report.path,
42 "type": report.pack_type,
43 "appended": report.appended,
44 });
45 println!("{}", serde_json::to_string(&out)?);
46 Ok(())
47}