mod args;
mod commands;
mod utils;
use anyhow::{Context, Result};
use clap::{Parser, Subcommand};
pub use args::*;
#[derive(Parser)]
#[command(name = "printwell")]
#[command(about = "HTML to PDF conversion tool")]
#[command(version)]
struct Cli {
#[command(subcommand)]
command: Commands,
#[arg(short, long, action = clap::ArgAction::Count, global = true)]
verbose: u8,
#[arg(short, long, global = true)]
quiet: bool,
}
#[derive(Subcommand)]
enum Commands {
Convert(Box<ConvertArgs>),
#[cfg(feature = "forms")]
Forms(FormsArgs),
#[cfg(feature = "signing")]
Sign(SignArgs),
#[cfg(feature = "signing")]
Verify(VerifyArgs),
#[cfg(feature = "signing")]
ListFields(ListFieldsArgs),
#[cfg(feature = "encrypt")]
Encrypt(EncryptArgs),
#[cfg(feature = "encrypt")]
Decrypt(DecryptArgs),
#[cfg(feature = "watermark")]
Watermark(WatermarkArgs),
#[cfg(feature = "bookmarks")]
Bookmarks(BookmarksArgs),
#[cfg(feature = "annotations")]
Annotate(AnnotateArgs),
#[cfg(feature = "pdfa")]
PdfaValidate(PdfaValidateArgs),
#[cfg(feature = "pdfa")]
PdfaConvert(PdfaConvertArgs),
#[cfg(feature = "pdfua")]
PdfuaValidate(PdfuaValidateArgs),
#[cfg(feature = "pdfua")]
PdfuaConvert(PdfuaConvertArgs),
ConvertBatch(ConvertBatchArgs),
Info(InfoArgs),
}
fn setup_logging(verbose: u8, quiet: bool) {
use tracing_subscriber::EnvFilter;
if quiet {
return;
}
let level = match verbose {
0 => "warn",
1 => "info",
2 => "debug",
_ => "trace",
};
tracing_subscriber::fmt()
.with_env_filter(
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(level)),
)
.init();
}
pub fn run(args: Vec<String>) -> Result<()> {
let cli = Cli::parse_from(args);
setup_logging(cli.verbose, cli.quiet);
let rt = tokio::runtime::Runtime::new().context("Failed to create async runtime")?;
rt.block_on(async {
match cli.command {
Commands::Convert(args) => commands::convert(*args).await,
#[cfg(feature = "forms")]
Commands::Forms(args) => commands::forms(&args),
#[cfg(feature = "signing")]
Commands::Sign(args) => commands::sign(args),
#[cfg(feature = "signing")]
Commands::Verify(args) => commands::verify(&args),
#[cfg(feature = "signing")]
Commands::ListFields(args) => commands::list_fields(&args),
#[cfg(feature = "encrypt")]
Commands::Encrypt(args) => commands::encrypt(&args),
#[cfg(feature = "encrypt")]
Commands::Decrypt(args) => commands::decrypt(&args),
#[cfg(feature = "watermark")]
Commands::Watermark(args) => commands::watermark(args),
#[cfg(feature = "bookmarks")]
Commands::Bookmarks(args) => commands::bookmarks(&args),
#[cfg(feature = "annotations")]
Commands::Annotate(args) => commands::annotate(&args),
#[cfg(feature = "pdfa")]
Commands::PdfaValidate(args) => commands::pdfa_validate(&args),
#[cfg(feature = "pdfa")]
Commands::PdfaConvert(args) => commands::pdfa_convert(&args),
#[cfg(feature = "pdfua")]
Commands::PdfuaValidate(args) => commands::pdfua_validate(&args),
#[cfg(feature = "pdfua")]
Commands::PdfuaConvert(args) => commands::pdfua_convert(&args),
Commands::ConvertBatch(args) => commands::convert_batch(args).await,
Commands::Info(args) => commands::info(args).await,
}
})
}