summaryrefslogtreecommitdiff
path: root/crates/typst-cli/src/args.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/typst-cli/src/args.rs')
-rw-r--r--crates/typst-cli/src/args.rs16
1 files changed, 16 insertions, 0 deletions
diff --git a/crates/typst-cli/src/args.rs b/crates/typst-cli/src/args.rs
index a8878611..14173a55 100644
--- a/crates/typst-cli/src/args.rs
+++ b/crates/typst-cli/src/args.rs
@@ -1,6 +1,7 @@
use std::fmt::{self, Display, Formatter};
use std::path::PathBuf;
+use chrono::{DateTime, Utc};
use clap::builder::ValueParser;
use clap::{ArgAction, Args, ColorChoice, Parser, Subcommand, ValueEnum};
use semver::Version;
@@ -167,6 +168,12 @@ pub struct SharedArgs {
)]
pub font_paths: Vec<PathBuf>,
+ /// The document's creation date formatted as a UNIX timestamp.
+ ///
+ /// For more information, see <https://reproducible-builds.org/specs/source-date-epoch/>.
+ #[clap(env = "SOURCE_DATE_EPOCH", value_parser = parse_source_date_epoch)]
+ pub source_date_epoch: Option<DateTime<Utc>>,
+
/// The format to emit diagnostics in
#[clap(
long,
@@ -176,6 +183,15 @@ pub struct SharedArgs {
pub diagnostic_format: DiagnosticFormat,
}
+/// Parses a UNIX timestamp according to <https://reproducible-builds.org/specs/source-date-epoch/>
+fn parse_source_date_epoch(raw: &str) -> Result<DateTime<Utc>, String> {
+ let timestamp: i64 = raw
+ .parse()
+ .map_err(|err| format!("timestamp must be decimal integer ({err})"))?;
+ DateTime::from_timestamp(timestamp, 0)
+ .ok_or_else(|| "timestamp out of range".to_string())
+}
+
/// An input that is either stdin or a real path.
#[derive(Debug, Clone)]
pub enum Input {