lintd_taskops/
lib.rs

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 with tech instrument-coverage, deps llvm-tools-preview & grcov
14    Coverage {
15        /// generate an html report
16        #[arg(short, long, default_value_t = false)]
17        dev: bool,
18        /// coveralls to stdout for neovim plugin
19        #[arg(long, default_value_t = false)]
20        neo: bool,
21    },
22    /// Regular ci tests: fmt, clippy, test
23    Ci,
24    /// Run cargo docs in watch mode
25    Docs,
26    /// Bump version and commit
27    Bump {
28        /// increment version part
29        #[arg(default_value = "patch")]
30        bump: String,
31    },
32    /// Publish and bump version auto commit
33    Publish,
34    /// Holder for per-project distribution receipt
35    Dist,
36    /// General addon targets
37    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    /// Command dist
48    /// # Errors
49    /// User throw errors.
50    fn dist() -> Result<()> {
51        println!("Warning: Empty dist receipt.");
52        Ok(())
53    }
54    /// Command rule
55    /// # Errors
56    /// User throw errors.
57    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    /// Main entrypoint.
65    ///
66    /// # Errors
67    /// error if tasks failed.
68    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
91/// Main entrypoint.
92///
93/// # Errors
94/// error if tasks failed.
95pub fn make() -> Result<()> {
96    MiniMaker::make()
97}