summaryrefslogtreecommitdiff
path: root/crates/typst-library/src/foundations
diff options
context:
space:
mode:
Diffstat (limited to 'crates/typst-library/src/foundations')
-rw-r--r--crates/typst-library/src/foundations/float.rs22
1 files changed, 22 insertions, 0 deletions
diff --git a/crates/typst-library/src/foundations/float.rs b/crates/typst-library/src/foundations/float.rs
index 21d0a8d8..353e498d 100644
--- a/crates/typst-library/src/foundations/float.rs
+++ b/crates/typst-library/src/foundations/float.rs
@@ -210,3 +210,25 @@ cast! {
fn parse_float(s: EcoString) -> Result<f64, ParseFloatError> {
s.replace(repr::MINUS_SIGN, "-").parse()
}
+
+/// A floating-point number that must be positive (strictly larger than zero).
+#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
+pub struct PositiveF64(f64);
+
+impl PositiveF64 {
+ /// Wrap a float if it is positive.
+ pub fn new(value: f64) -> Option<Self> {
+ (value > 0.0).then_some(Self(value))
+ }
+
+ /// Get the underlying value.
+ pub fn get(self) -> f64 {
+ self.0
+ }
+}
+
+cast! {
+ PositiveF64,
+ self => self.get().into_value(),
+ v: f64 => Self::new(v).ok_or("number must be positive")?,
+}