greentic_component/
cli.rs1use anyhow::{Error, Result, bail};
2use clap::{Parser, Subcommand};
3
4use crate::cmd::{
5 self, doctor::DoctorArgs, flow::FlowCommand, hash::HashArgs, inspect::InspectArgs,
6 new::NewArgs, store::StoreCommand, templates::TemplatesArgs,
7};
8use crate::scaffold::engine::ScaffoldEngine;
9
10#[derive(Parser, Debug)]
11#[command(
12 name = "greentic-component",
13 about = "Toolkit for Greentic component developers",
14 version,
15 propagate_version = true,
16 arg_required_else_help = true,
17 disable_version_flag = true
18)]
19pub struct Cli {
20 #[command(subcommand)]
21 command: Commands,
22}
23
24#[derive(Subcommand, Debug)]
25enum Commands {
26 New(NewArgs),
28 Templates(TemplatesArgs),
30 Doctor(DoctorArgs),
32 Inspect(InspectArgs),
34 Hash(HashArgs),
36 #[command(subcommand)]
38 Flow(FlowCommand),
39 #[command(subcommand)]
41 Store(StoreCommand),
42}
43
44pub fn main() -> Result<()> {
45 let cli = Cli::parse();
46 let engine = ScaffoldEngine::new();
47 match cli.command {
48 Commands::New(args) => cmd::new::run(args, &engine),
49 Commands::Templates(args) => cmd::templates::run(args, &engine),
50 Commands::Doctor(args) => cmd::doctor::run(args).map_err(Error::new),
51 Commands::Inspect(args) => {
52 let result = cmd::inspect::run(&args)?;
53 cmd::inspect::emit_warnings(&result.warnings);
54 if args.strict && !result.warnings.is_empty() {
55 bail!(
56 "component-inspect: {} warning(s) treated as errors (--strict)",
57 result.warnings.len()
58 );
59 }
60 Ok(())
61 }
62 Commands::Hash(args) => cmd::hash::run(args),
63 Commands::Flow(flow_cmd) => cmd::flow::run(flow_cmd),
64 Commands::Store(store_cmd) => cmd::store::run(store_cmd),
65 }
66}
67
68#[cfg(test)]
69mod tests {
70 use super::*;
71
72 #[test]
73 fn parses_new_subcommand() {
74 let cli = Cli::try_parse_from(["greentic-component", "new", "--name", "demo", "--json"])
75 .expect("expected CLI to parse");
76 match cli.command {
77 Commands::New(args) => {
78 assert_eq!(args.name, "demo");
79 assert!(args.json);
80 assert!(!args.no_check);
81 assert!(!args.no_git);
82 }
83 _ => panic!("expected new args"),
84 }
85 }
86}