pub mod bump;
pub mod clone;
pub mod generate;
pub mod get;
pub mod init;
pub mod install;
pub mod link;
pub mod list;
pub mod metadata;
pub mod package_path;
pub mod publish;
pub mod sync;
pub mod unlink;
use std::path::PathBuf;
use std::str::FromStr;
use clap::{Parser, Subcommand};
use clap_complete::Shell;
use tracing::Level;
use typst_syntax::package::{PackageVersion, VersionBound};
use crate::build;
use crate::utils::output::OutputFormat;
fn parse_eco<T>(s: &str) -> Result<T, String>
where
T: FromStr<Err = ecow::EcoString>,
{
T::from_str(s).map_err(Into::into)
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct InitArgs {
#[arg(short = 'm', long, requires = "ni")]
cli: bool,
#[arg(short, long)]
force: bool,
#[arg(short, long, group = "ni")]
name: Option<String>,
#[arg(short = 'V', long, default_value_t=PackageVersion::from_str("1.0.0").unwrap(), value_parser=parse_eco::<PackageVersion>)]
version: PackageVersion,
#[arg(short, long, default_value_t=String::from("main.typ"))]
entrypoint: String,
#[arg(short, long)]
#[clap(value_delimiter = ',')]
authors: Option<Vec<String>>,
#[arg(short, long)]
license: Option<String>,
#[arg(short, long)]
description: Option<String>,
#[arg(short, long)]
repository: Option<String>,
#[arg(short = 'H', long)]
homepage: Option<String>,
#[arg(short, long)]
#[clap(value_delimiter = ',')]
keywords: Option<Vec<String>>,
#[arg(short, long, value_parser=parse_eco::<VersionBound>)]
compiler: Option<VersionBound>,
#[arg(short = 'x', long)]
#[clap(value_delimiter = ',')]
exclude: Option<Vec<String>>,
#[arg(short = 'N', long)]
namespace: Option<String>,
#[arg(short = 'p', long)]
populate: bool,
#[arg(short = 'C', long)]
#[clap(value_delimiter = ',')]
categories: Option<Vec<String>>,
#[arg(long)]
#[clap(value_delimiter = ',')]
disciplines: Option<Vec<String>>,
#[arg(long)]
template_path: Option<String>,
#[arg(long)]
template_entrypoint: Option<String>,
#[arg(long)]
template_thumbnail: Option<String>,
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct LinkArgs {
#[arg(short, long)]
pub force: bool,
#[arg(short, long)]
pub no_copy: bool,
pub namespace: Option<String>,
#[arg(short = 'i', default_value_t = false)]
ignore: bool,
#[arg(short = 'g', default_value_t = true)]
git_ignore: bool,
#[arg(short = 't', default_value_t = true)]
typst_ignore: bool,
#[arg(short = 'G', default_value_t = true)]
git_global_ignore: bool,
#[arg(short = 'x', default_value_t = true)]
git_exclude: bool,
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct ListTreeArgs {
#[arg(short, long)]
pub all: bool,
#[arg(short, long, num_args = 1..)]
pub include: Option<Vec<String>>,
#[arg(short, long)]
pub tree: bool,
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct BumpArgs {
#[arg(short, long)]
pub tag: Option<String>,
#[arg(short, long, num_args = 1..)]
pub include: Vec<String>,
pub new_version: String,
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct PublishArgs {
#[arg()]
path: Option<PathBuf>,
#[arg(short = 'i', default_value_t = false)]
ignore: bool,
#[arg(short = 'g', default_value_t = true)]
git_ignore: bool,
#[arg(short = 't', default_value_t = true)]
typst_ignore: bool,
#[arg(short = 'G', default_value_t = true)]
git_global_ignore: bool,
#[arg(short = 'x', default_value_t = true)]
git_exclude: bool,
#[arg(long, default_value_t = false)]
bypass_warning: bool,
#[arg(short = 'c')]
custom_ignore: Option<PathBuf>,
#[arg(short = 'm')]
message: Option<String>,
#[arg(short = 'p', default_value_t = false)]
prepare_only: bool,
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct GenerateArgs {
#[arg(value_enum)]
generator: Shell,
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct CloneArgs {
#[arg()]
pub package: String,
#[arg()]
pub path: Option<PathBuf>,
#[arg(short = 'd')]
pub download_only: bool,
#[arg(short = 'f')]
pub force: bool,
#[arg(short = 'r')]
pub redownload: bool,
#[arg(short = 's')]
pub symlink: bool,
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct UnlinkArgs {
package: String,
#[arg(short, long)]
yes: bool,
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct InstallArgs {
#[arg(num_args = 1..)]
pub url: String,
#[arg(short, long)]
pub namespace: Option<String>,
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct SyncArgs {
#[clap(short, long)]
pub files: Vec<String>,
#[clap(short, long)]
pub check_only: bool,
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct GetArgs {
pub packages: Vec<String>,
}
#[derive(Parser, Clone, Debug, PartialEq)]
pub struct MetadataArgs {
#[arg(short, long)]
pub path: Option<PathBuf>,
#[arg(short, long)]
pub field: Option<String>,
}
#[derive(Subcommand, Debug, PartialEq)]
pub enum PackagesArgs {
#[command(visible_alias = "l")]
List(ListTreeArgs),
#[command(visible_alias = "p")]
Path,
#[command(visible_alias = "u")]
Unlink(UnlinkArgs),
#[command(visible_alias = "g")]
Get(GetArgs),
#[command(visible_alias = "i")]
Install(InstallArgs),
}
#[derive(Subcommand, Debug, PartialEq)]
#[allow(clippy::large_enum_variant)]
pub enum ProjectArgs {
#[command(visible_alias = "l")]
Link(LinkArgs),
#[command(visible_alias = "n")]
Init(InitArgs),
#[command(visible_alias = "p")]
Publish(PublishArgs),
#[command()]
#[command(visible_alias = "c")]
Clone(CloneArgs),
#[command()]
#[command(visible_alias = "b")]
Bump(BumpArgs),
#[command()]
#[command(visible_alias = "s")]
Sync(SyncArgs),
#[command()]
#[command(visible_alias = "m")]
Metadata(MetadataArgs),
}
#[allow(clippy::large_enum_variant)]
#[derive(Subcommand, Debug, PartialEq)]
pub enum Commands {
#[command(subcommand)]
#[command(visible_alias = "prj")]
Project(ProjectArgs),
#[command(subcommand)]
#[command(visible_alias = "pkg")]
Packages(PackagesArgs),
#[command(visible_alias = "g")]
Generate(GenerateArgs),
}
#[derive(Parser, Debug, PartialEq)]
#[command(author = "Thumuss & typst-community", version = build::PKG_VERSION)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
#[arg(
default_value = "info",
short = 'v',
long,
global = true,
env = "UTPM_DEBUG",
value_enum
)]
pub verbose: Level,
#[arg(default_value_t = OutputFormat::Text, short = 'o', long, global = true, value_enum)]
pub output_format: OutputFormat,
#[arg(default_value_t = false, short = 'D', long, global = true)]
pub dry_run: bool,
}