use std::path::PathBuf;
use std::process;
use clap::{Parser, Subcommand};
mod commands;
#[derive(Parser)]
#[command(name = "fidius", about = "Fidius plugin framework CLI", version)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
InitInterface {
name: String,
#[arg(long = "trait")]
trait_name: String,
#[arg(long)]
path: Option<PathBuf>,
#[arg(long)]
version: Option<String>,
#[arg(long)]
extension: Option<String>,
},
InitPlugin {
name: String,
#[arg(long)]
interface: String,
#[arg(long = "trait")]
trait_name: String,
#[arg(long)]
path: Option<PathBuf>,
#[arg(long)]
version: Option<String>,
},
Keygen {
#[arg(long)]
out: String,
},
Sign {
#[arg(long)]
key: PathBuf,
dylib: PathBuf,
},
Verify {
#[arg(long)]
key: PathBuf,
dylib: PathBuf,
},
Inspect {
dylib: PathBuf,
},
Package {
#[command(subcommand)]
command: PackageCommands,
},
}
#[derive(Subcommand)]
enum PackageCommands {
Validate {
dir: PathBuf,
},
Build {
dir: PathBuf,
#[arg(long)]
debug: bool,
},
Inspect {
dir: PathBuf,
},
Sign {
#[arg(long)]
key: PathBuf,
dir: PathBuf,
},
Verify {
#[arg(long)]
key: PathBuf,
dir: PathBuf,
},
Pack {
dir: PathBuf,
#[arg(long)]
output: Option<PathBuf>,
},
Unpack {
archive: PathBuf,
#[arg(long)]
dest: Option<PathBuf>,
},
}
fn main() {
let cli = Cli::parse();
let result = match cli.command {
Commands::InitInterface {
name,
trait_name,
path,
version,
extension,
} => commands::init_interface(
&name,
&trait_name,
path.as_deref(),
version.as_deref(),
extension.as_deref(),
),
Commands::InitPlugin {
name,
interface,
trait_name,
path,
version,
} => commands::init_plugin(
&name,
&interface,
&trait_name,
path.as_deref(),
version.as_deref(),
),
Commands::Keygen { out } => commands::keygen(&out),
Commands::Sign { key, dylib } => commands::sign(&key, &dylib),
Commands::Verify { key, dylib } => commands::verify(&key, &dylib),
Commands::Inspect { dylib } => commands::inspect(&dylib),
Commands::Package { command } => match command {
PackageCommands::Validate { dir } => commands::package_validate(&dir),
PackageCommands::Build { dir, debug } => commands::package_build(&dir, !debug),
PackageCommands::Inspect { dir } => commands::package_inspect(&dir),
PackageCommands::Sign { key, dir } => commands::package_sign(&key, &dir),
PackageCommands::Verify { key, dir } => commands::package_verify(&key, &dir),
PackageCommands::Pack { dir, output } => {
commands::package_pack(&dir, output.as_deref())
}
PackageCommands::Unpack { archive, dest } => {
commands::package_unpack(&archive, dest.as_deref())
}
},
};
if let Err(e) = result {
eprintln!("error: {e}");
process::exit(1);
}
}