use std::path::PathBuf;
use std::process::ExitCode;
use clap::{Parser, Subcommand};
#[derive(Debug, Parser)]
#[command(
name = "umbral",
about = "umbral project scaffolding. `cargo install umbral-cli` puts this on your PATH.",
disable_help_subcommand = true
)]
struct Cli {
#[command(subcommand)]
command: Command,
}
#[derive(Debug, Subcommand)]
enum Command {
Startproject {
name: String,
#[arg(long, default_value = ".")]
path: PathBuf,
#[arg(long, value_name = "PATH")]
local: Option<PathBuf>,
},
Startapp {
name: String,
#[arg(long, default_value = ".")]
path: PathBuf,
#[arg(long, value_name = "PATH")]
local: Option<PathBuf>,
},
Startplugin {
name: String,
#[arg(long, default_value = ".")]
path: PathBuf,
#[arg(long, value_name = "PATH")]
local: Option<PathBuf>,
},
}
fn main() -> ExitCode {
let cli = Cli::parse();
let result = match cli.command {
Command::Startproject { name, path, local } => {
umbral_cli::scaffold::scaffold_project(&name, &path, local.as_deref()).map(|r| {
println!("Created `{}`:", r.root.display());
for f in &r.files {
println!(" {}", f.display());
}
println!();
println!("Next steps:");
for step in &r.next_steps {
println!(" {step}");
}
})
}
Command::Startapp { name, path, local } => {
umbral_cli::scaffold::scaffold_app(&name, &path, local.as_deref()).map(|r| {
println!("Created `{}`:", r.root.display());
for f in &r.files {
println!(" {}", f.display());
}
println!();
match r.cargo_toml_registered {
Some(true) => println!(
"Registered `{name} = {{ path = \"plugins/{name}\" }}` in Cargo.toml."
),
Some(false) => println!(
"Cargo.toml already lists `{name}` — no duplicate added."
),
None => println!(
"Note: could not find a Cargo.toml to update. \
Add `{name} = {{ path = \"plugins/{name}\" }}` manually."
),
}
println!();
println!("Next step:");
for step in &r.next_steps {
println!(" {step}");
}
})
}
Command::Startplugin { name, path, local } => {
umbral_cli::scaffold::scaffold_plugin(&name, &path, local.as_deref()).map(|r| {
println!("Created `{}`:", r.root.display());
for f in &r.files {
println!(" {}", f.display());
}
println!();
match r.cargo_toml_registered {
Some(true) => println!(
"Registered `{name} = {{ path = \"plugins/{name}\" }}` in Cargo.toml."
),
Some(false) => println!(
"Cargo.toml already lists `{name}` — no duplicate added."
),
None => println!(
"Note: could not find a Cargo.toml to update. \
Add `{name} = {{ path = \"plugins/{name}\" }}` manually."
),
}
println!();
println!("Next steps:");
for step in &r.next_steps {
println!(" {step}");
}
})
}
};
match result {
Ok(()) => ExitCode::SUCCESS,
Err(err) => {
eprintln!("error: {err}");
ExitCode::FAILURE
}
}
}