summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/Cargo.toml5
-rw-r--r--cli/build.rs52
-rw-r--r--cli/src/args.rs58
-rw-r--r--cli/src/main.rs63
4 files changed, 116 insertions, 62 deletions
diff --git a/cli/Cargo.toml b/cli/Cargo.toml
index 656dd0d9..6bffca2e 100644
--- a/cli/Cargo.toml
+++ b/cli/Cargo.toml
@@ -29,6 +29,11 @@ walkdir = "2"
clap = { version = "4.2.1", features = ["derive"] }
open = "4.0.1"
+[build-dependencies]
+clap = { version = "4.2.1", features = ["derive", "string"] }
+clap_complete = "4.2.0"
+clap_mangen = "0.2.10"
+
[features]
default = ["embed-fonts"]
diff --git a/cli/build.rs b/cli/build.rs
index 014960f4..75e8492a 100644
--- a/cli/build.rs
+++ b/cli/build.rs
@@ -1,9 +1,15 @@
+use std::env;
+use std::fs::{create_dir_all, File};
+use std::path::Path;
use std::process::Command;
-fn main() {
- println!("cargo:rerun-if-env-changed=TYPST_VERSION");
- if option_env!("TYPST_VERSION").is_some() {
- return;
+use clap::{CommandFactory, ValueEnum};
+use clap_complete::{generate_to, Shell};
+use clap_mangen::Man;
+
+pub fn typst_version() -> String {
+ if let Some(version) = option_env!("TYPST_VERSION") {
+ return version.to_owned();
}
let pkg = env!("CARGO_PKG_VERSION");
@@ -13,7 +19,41 @@ fn main() {
.ok()
.filter(|output| output.status.success())
.and_then(|output| String::from_utf8(output.stdout.get(..8)?.into()).ok())
- .unwrap_or_else(|| "(unknown hash)".into());
+ .unwrap_or_else(|| "unknown hash".into());
+
+ format!("{pkg} ({hash})")
+}
+
+mod args {
+ include!("src/args.rs");
+}
+
+fn main() {
+ println!("cargo:rerun-if-env-changed=TYPST_VERSION");
+ println!("cargo:rerun-if-env-changed=GEN_ARTIFACTS");
+
+ if option_env!("TYPST_VERSION").is_none() {
+ println!("cargo:rustc-env=TYPST_VERSION={}", typst_version());
+ }
- println!("cargo:rustc-env=TYPST_VERSION={pkg} ({hash})");
+ if let Some(dir) = env::var_os("GEN_ARTIFACTS") {
+ let out = &Path::new(&dir);
+ create_dir_all(out).unwrap();
+ let cmd = &mut args::CliArguments::command();
+
+ Man::new(cmd.clone())
+ .render(&mut File::create(out.join("typst.1")).unwrap())
+ .unwrap();
+
+ for subcmd in cmd.get_subcommands() {
+ let name = format!("typst-{}", subcmd.get_name());
+ Man::new(subcmd.clone().name(&name))
+ .render(&mut File::create(out.join(format!("{name}.1"))).unwrap())
+ .unwrap();
+ }
+
+ for shell in Shell::value_variants() {
+ generate_to(*shell, cmd, "typst", out).unwrap();
+ }
+ }
}
diff --git a/cli/src/args.rs b/cli/src/args.rs
new file mode 100644
index 00000000..c88c9a21
--- /dev/null
+++ b/cli/src/args.rs
@@ -0,0 +1,58 @@
+use std::path::PathBuf;
+
+use clap::{ArgAction, Parser, Subcommand};
+
+/// typst creates PDF files from .typ files
+#[derive(Debug, Clone, Parser)]
+#[clap(name = "typst", version = crate::typst_version(), author)]
+pub struct CliArguments {
+ /// Add additional directories to search for fonts
+ #[clap(long = "font-path", value_name = "DIR", action = ArgAction::Append)]
+ pub font_paths: Vec<PathBuf>,
+
+ /// Configure the root for absolute paths
+ #[clap(long = "root", value_name = "DIR")]
+ pub root: Option<PathBuf>,
+
+ /// The typst command to run
+ #[command(subcommand)]
+ pub command: Command,
+}
+
+/// What to do.
+#[derive(Debug, Clone, Subcommand)]
+#[command()]
+pub enum Command {
+ /// Compiles the input file into a PDF file
+ #[command(visible_alias = "c")]
+ Compile(CompileCommand),
+
+ /// Watches the input file and recompiles on changes
+ #[command(visible_alias = "w")]
+ Watch(CompileCommand),
+
+ /// List all discovered fonts in system and custom font paths
+ Fonts(FontsCommand),
+}
+
+/// Compiles the input file into a PDF file
+#[derive(Debug, Clone, Parser)]
+pub struct CompileCommand {
+ /// Path to input Typst file
+ pub input: PathBuf,
+
+ /// Path to output PDF file
+ pub output: Option<PathBuf>,
+
+ /// Opens the output file after compilation using the default PDF viewer
+ #[arg(long = "open")]
+ pub open: Option<Option<String>>,
+}
+
+/// List all discovered fonts in system and custom font paths
+#[derive(Debug, Clone, Parser)]
+pub struct FontsCommand {
+ /// Also list style variants of each font family
+ #[arg(long)]
+ pub variants: bool,
+}
diff --git a/cli/src/main.rs b/cli/src/main.rs
index d0dcc2bd..1190232d 100644
--- a/cli/src/main.rs
+++ b/cli/src/main.rs
@@ -1,3 +1,5 @@
+mod args;
+
use std::cell::{RefCell, RefMut};
use std::collections::HashMap;
use std::fs::{self, File};
@@ -6,7 +8,7 @@ use std::io::{self, Write};
use std::path::{Path, PathBuf};
use std::process;
-use clap::{ArgAction, Parser, Subcommand};
+use clap::Parser;
use codespan_reporting::diagnostic::{Diagnostic, Label};
use codespan_reporting::term::{self, termcolor};
use comemo::Prehashed;
@@ -25,64 +27,13 @@ use typst::util::{Buffer, PathExt};
use typst::World;
use walkdir::WalkDir;
+use crate::args::{CliArguments, Command, CompileCommand};
+
type CodespanResult<T> = Result<T, CodespanError>;
type CodespanError = codespan_reporting::files::Error;
-const TYPST_VERSION: &str = env!("TYPST_VERSION");
-
-/// typst creates PDF files from .typ files
-#[derive(Debug, Clone, Parser)]
-#[clap(name = "typst", version = TYPST_VERSION, author)]
-pub struct CliArguments {
- /// Add additional directories to search for fonts
- #[clap(long = "font-path", value_name = "DIR", action = ArgAction::Append)]
- font_paths: Vec<PathBuf>,
-
- /// Configure the root for absolute paths
- #[clap(long = "root", value_name = "DIR")]
- root: Option<PathBuf>,
-
- /// The typst command to run
- #[command(subcommand)]
- command: Command,
-}
-
-/// What to do.
-#[derive(Debug, Clone, Subcommand)]
-#[command()]
-enum Command {
- /// Compiles the input file into a PDF file
- #[command(visible_alias = "c")]
- Compile(CompileCommand),
-
- /// Watches the input file and recompiles on changes
- #[command(visible_alias = "w")]
- Watch(CompileCommand),
-
- /// List all discovered fonts in system and custom font paths
- Fonts(FontsCommand),
-}
-
-/// Compiles the input file into a PDF file
-#[derive(Debug, Clone, Parser)]
-pub struct CompileCommand {
- /// Path to input Typst file
- input: PathBuf,
-
- /// Path to output PDF file
- output: Option<PathBuf>,
-
- /// Opens the output file after compilation using the default PDF viewer
- #[arg(long = "open")]
- open: Option<Option<String>>,
-}
-
-/// List all discovered fonts in system and custom font paths
-#[derive(Debug, Clone, Parser)]
-pub struct FontsCommand {
- /// Also list style variants of each font family
- #[arg(long)]
- variants: bool,
+pub fn typst_version() -> &'static str {
+ env!("TYPST_VERSION")
}
/// A summary of the input arguments relevant to compilation.