use std::path::PathBuf;
use clap::{Parser, Subcommand};
pub const DEFAULT_OUT: &str = "_site";
#[derive(Parser, Debug)]
#[command(
name = "plates",
version,
about = "A static site generator over a prov archive",
long_about = None,
)]
pub struct Cli {
#[arg(
short = 'C',
long = "root",
value_name = "DIR",
global = true,
env = "PLATES_ROOT"
)]
pub root: Option<PathBuf>,
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand, Debug)]
pub enum Command {
Build {
#[command(flatten)]
site: SiteArgs,
#[command(flatten)]
out: OutArgs,
#[arg(long)]
force: bool,
},
Watch {
#[command(flatten)]
site: SiteArgs,
#[command(flatten)]
out: OutArgs,
#[arg(long)]
force: bool,
},
Serve {
#[command(flatten)]
site: SiteArgs,
#[arg(long, default_value = "127.0.0.1", value_name = "HOST")]
host: String,
#[arg(short, long, value_name = "PORT")]
port: Option<u16>,
#[arg(long)]
open: bool,
},
Clean {
#[command(flatten)]
out: OutArgs,
#[arg(long)]
force: bool,
},
}
#[derive(clap::Args, Debug, Clone)]
pub struct SiteArgs {
#[arg(long, value_name = "NAME")]
pub site: Option<String>,
#[arg(long, value_name = "URL")]
pub base_url: Option<String>,
#[arg(long, value_name = "DEPTH", num_args = 0..=1, default_missing_value = "8")]
pub follow: Option<usize>,
#[arg(long, value_name = "FILE", env = "PROV_PEERS", requires = "follow")]
pub peers: Option<PathBuf>,
#[arg(long, requires = "follow")]
pub unverified: bool,
}
impl SiteArgs {
pub fn follow(&self) -> Option<crate::build::Follow> {
let depth = self.follow?;
let peers = match &self.peers {
Some(file) => plates::prov::PeerFile::load(file),
None => plates::prov::PeerFile::from_device(),
};
Some(crate::build::Follow {
peers,
descent: plates::prov::Descent {
depth,
trust: if self.unverified {
plates::prov::Trust::Unverified
} else {
plates::prov::Trust::Confirmed
},
},
})
}
}
#[derive(clap::Args, Debug, Clone)]
pub struct OutArgs {
#[arg(short, long, value_name = "DIR", default_value = DEFAULT_OUT, env = "PLATES_OUT")]
pub out: PathBuf,
}