use clap::{Parser, Subcommand};
use std::path::Path;
mod browse;
mod install;
mod list;
mod model;
mod output;
mod package;
mod uninstall;
use model::Model;
use output::print;
#[derive(Parser)]
#[command(version, about, long_about = None)]
struct Args {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Browse {
#[arg(value_name = "PKG_URI")]
uri: String,
},
Install {
#[arg(value_name = "PKG_URI")]
uri: String,
#[arg(short, long)]
domain: String,
#[arg(short, long)]
namespace: Option<String>,
#[arg(short, long)]
path: Option<Vec<String>>,
},
List {
#[arg(short, long)]
domain: String,
},
Package {
#[arg(value_name = "S3_URI")]
uri: String,
#[arg(short, long, value_name = "PKG_URI")]
target: String,
},
Uninstall {
#[arg(short, long)]
namespace: String,
#[arg(short, long)]
domain: String,
},
}
pub async fn init() -> Result<(), std::io::Error> {
let args = Args::parse();
match args.command {
Commands::Browse { uri } => {
let (m, temp_dir) = Model::from_temp_dir()?;
let args = browse::Input { uri };
tracing::info!("Browsing {:?} using {:?}", args, temp_dir);
print(browse::command(m, args).await);
Ok(())
}
Commands::Install {
path,
domain,
namespace,
uri,
} => {
let root = Path::new(&domain).to_path_buf();
let m = Model::from(root);
let args = install::Input {
namespace,
paths: path,
uri,
};
tracing::info!("Installing {:?}", args);
print(install::command(m, args).await);
Ok(())
}
Commands::List { domain } => {
let root = Path::new(&domain).to_path_buf();
let m = Model::from(root);
tracing::info!("Listing installed packages");
print(list::command(m).await);
Ok(())
}
Commands::Package { uri, target } => {
let (m, temp_dir) = Model::from_temp_dir()?;
let args = package::Input { target, uri };
tracing::info!("Packaging {:?} using {:?}", args, temp_dir);
print(package::command(m, args).await);
Ok(())
}
Commands::Uninstall { domain, namespace } => {
let root = Path::new(&domain).to_path_buf();
let m = Model::from(root);
let args = uninstall::Input { namespace };
tracing::info!("Uninstalling {:?}", args);
print(uninstall::command(m, args).await);
Ok(())
}
}
}
#[derive(thiserror::Error, Debug)]
enum Error {
#[error("quilt_rs error: {0}")]
Quilt(quilt_rs::Error),
}
impl From<quilt_rs::Error> for Error {
fn from(err: quilt_rs::Error) -> Error {
Error::Quilt(err)
}
}