1use anyhow::Result;
2use clap::{Parser, Subcommand};
3
4#[derive(Parser)]
5#[command(author, version, about, long_about = None)]
6struct Cli {
7 #[command(subcommand)]
8 command: Commands,
9}
10
11#[derive(Subcommand)]
12enum Commands {
13 Coverage {
15 #[arg(short, long, default_value_t = false)]
17 dev: bool,
18 #[arg(long, default_value_t = false)]
20 neo: bool,
21 },
22 Ci,
24 Docs,
26 Bump {
28 #[arg(default_value = "patch")]
30 bump: String,
31 },
32 Publish,
34 Dist,
36 Rule {
38 #[arg(default_value = "default")]
39 target: String,
40 rule_options: Vec<String>,
41 },
42}
43
44pub mod ops;
45
46pub trait Addon {
47 fn dist() -> Result<()> {
51 println!("Warning: Empty dist receipt.");
52 Ok(())
53 }
54 fn rule(target: String, options: Vec<String>) -> Result<()> {
58 println!("Warning: Empty receipt for target {target}, options: {options:?}");
59 Ok(())
60 }
61}
62
63pub trait Make: Addon {
64 fn make() -> Result<()> {
69 let cli = Cli::parse();
70 match &cli.command {
71 Commands::Ci => xtaskops::tasks::ci(),
72 Commands::Docs => xtaskops::tasks::docs(),
73 Commands::Coverage { dev, neo: false } => xtaskops::tasks::coverage(*dev),
74 Commands::Coverage { neo: true, .. } => ops::neo_coverage(),
75 Commands::Bump { bump } => ops::bump_version(bump),
76 Commands::Publish => ops::publish(),
77 Commands::Dist => Self::dist(),
78 Commands::Rule {
79 target,
80 rule_options,
81 } => Self::rule(target.clone(), rule_options.clone()),
82 }
83 }
84}
85
86impl<T> Make for T where T: Addon {}
87
88struct MiniMaker();
89impl Addon for MiniMaker {}
90
91pub fn make() -> Result<()> {
96 MiniMaker::make()
97}