summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-11-22 14:30:43 +0100
committerLaurenz <laurmaedje@gmail.com>2021-11-29 16:47:35 +0100
commited50661378f356e02c6ec943bc4840091d33cfbd (patch)
tree7ed51339ea1a4b7ccc4308c902b36e86f9c07e26 /src/library
parentcef46e6c40fed0089a20e44ff2f251c06878891c (diff)
Castable optional and smart values
Diffstat (limited to 'src/library')
-rw-r--r--src/library/deco.rs2
-rw-r--r--src/library/mod.rs8
-rw-r--r--src/library/page.rs24
-rw-r--r--src/library/shape.rs6
-rw-r--r--src/library/text.rs27
5 files changed, 35 insertions, 32 deletions
diff --git a/src/library/deco.rs b/src/library/deco.rs
index 1f8c051f..cb065689 100644
--- a/src/library/deco.rs
+++ b/src/library/deco.rs
@@ -17,7 +17,7 @@ pub fn overline(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> {
}
fn line_impl(args: &mut Args, kind: LineKind) -> TypResult<Value> {
- let stroke = args.named("stroke")?.or_else(|| args.find()).map(Paint::Solid);
+ let stroke = args.named("stroke")?.or_else(|| args.find());
let thickness = args.named::<Linear>("thickness")?.or_else(|| args.find());
let offset = args.named("offset")?;
let extent = args.named("extent")?.unwrap_or_default();
diff --git a/src/library/mod.rs b/src/library/mod.rs
index 7b8acf9e..6260e6fc 100644
--- a/src/library/mod.rs
+++ b/src/library/mod.rs
@@ -26,7 +26,7 @@ mod prelude {
pub use std::rc::Rc;
pub use crate::diag::{At, TypResult};
- pub use crate::eval::{Args, EvalContext, Template, Value};
+ pub use crate::eval::{Args, EvalContext, Smart, Template, Value};
pub use crate::frame::*;
pub use crate::geom::*;
pub use crate::layout::*;
@@ -144,3 +144,9 @@ dynamic! {
FontFamily: "font family",
Value::Str(string) => Self::Named(string.to_lowercase()),
}
+
+castable! {
+ Paint,
+ Expected: "color",
+ Value::Color(color) => Paint::Solid(color),
+}
diff --git a/src/library/page.rs b/src/library/page.rs
index 20871bd9..b256a521 100644
--- a/src/library/page.rs
+++ b/src/library/page.rs
@@ -12,13 +12,13 @@ pub fn page(ctx: &mut EvalContext, args: &mut Args) -> TypResult<Value> {
let paper = args.named::<Paper>("paper")?.or_else(|| args.find());
let width = args.named("width")?;
let height = args.named("height")?;
+ let flip = args.named("flip")?;
let margins = args.named("margins")?;
let left = args.named("left")?;
let top = args.named("top")?;
let right = args.named("right")?;
let bottom = args.named("bottom")?;
- let flip = args.named("flip")?;
- let fill = args.named("fill")?.map(Paint::Solid);
+ let fill = args.named("fill")?;
ctx.template.modify(move |style| {
let page = style.page_mut();
@@ -33,37 +33,37 @@ pub fn page(ctx: &mut EvalContext, args: &mut Args) -> TypResult<Value> {
page.size.w = width;
}
+ if flip.unwrap_or(false) {
+ std::mem::swap(&mut page.size.w, &mut page.size.h);
+ }
+
if let Some(height) = height {
page.class = PaperClass::Custom;
page.size.h = height;
}
if let Some(margins) = margins {
- page.margins = Sides::splat(Some(margins));
+ page.margins = Sides::splat(margins);
}
if let Some(left) = left {
- page.margins.left = Some(left);
+ page.margins.left = left;
}
if let Some(top) = top {
- page.margins.top = Some(top);
+ page.margins.top = top;
}
if let Some(right) = right {
- page.margins.right = Some(right);
+ page.margins.right = right;
}
if let Some(bottom) = bottom {
- page.margins.bottom = Some(bottom);
- }
-
- if flip.unwrap_or(false) {
- std::mem::swap(&mut page.size.w, &mut page.size.h);
+ page.margins.bottom = bottom;
}
if let Some(fill) = fill {
- page.fill = Some(fill);
+ page.fill = fill;
}
});
diff --git a/src/library/shape.rs b/src/library/shape.rs
index abf927e4..f47da82f 100644
--- a/src/library/shape.rs
+++ b/src/library/shape.rs
@@ -58,11 +58,11 @@ fn shape_impl(
};
// Parse fill & stroke.
- let fill = args.named("fill")?.map(Paint::Solid);
+ let fill = args.named("fill")?.unwrap_or(None);
let stroke = match (args.named("stroke")?, args.named("thickness")?) {
(None, None) => fill.is_none().then(|| default),
- (color, thickness) => Some(Stroke {
- paint: color.map(Paint::Solid).unwrap_or(default.paint),
+ (color, thickness) => color.unwrap_or(Some(default.paint)).map(|paint| Stroke {
+ paint,
thickness: thickness.unwrap_or(default.thickness),
}),
};
diff --git a/src/library/text.rs b/src/library/text.rs
index d0b5c8e6..c0ee80e1 100644
--- a/src/library/text.rs
+++ b/src/library/text.rs
@@ -93,18 +93,16 @@ pub fn font(ctx: &mut EvalContext, args: &mut Args) -> TypResult<Value> {
castable! {
StylisticSet,
- Expected: "none or integer",
- Value::None => Self(None),
+ Expected: "integer",
Value::Int(v) => match v {
- 1 ..= 20 => Self(Some(v as u8)),
+ 1 ..= 20 => Self::new(v as u8),
_ => Err("must be between 1 and 20")?,
},
}
castable! {
NumberType,
- Expected: "auto or string",
- Value::Auto => Self::Auto,
+ Expected: "string",
Value::Str(string) => match string.as_str() {
"lining" => Self::Lining,
"old-style" => Self::OldStyle,
@@ -114,8 +112,7 @@ pub fn font(ctx: &mut EvalContext, args: &mut Args) -> TypResult<Value> {
castable! {
NumberWidth,
- Expected: "auto or string",
- Value::Auto => Self::Auto,
+ Expected: "string",
Value::Str(string) => match string.as_str() {
"proportional" => Self::Proportional,
"tabular" => Self::Tabular,
@@ -629,8 +626,8 @@ fn tags(features: &FontFeatures) -> Vec<Feature> {
}
let storage;
- if let StylisticSet(Some(set @ 1 ..= 20)) = features.stylistic_set {
- storage = [b's', b's', b'0' + set / 10, b'0' + set % 10];
+ if let Some(set) = features.stylistic_set {
+ storage = [b's', b's', b'0' + set.get() / 10, b'0' + set.get() % 10];
feat(&storage, 1);
}
@@ -648,15 +645,15 @@ fn tags(features: &FontFeatures) -> Vec<Feature> {
}
match features.numbers.type_ {
- NumberType::Auto => {}
- NumberType::Lining => feat(b"lnum", 1),
- NumberType::OldStyle => feat(b"onum", 1),
+ Smart::Auto => {}
+ Smart::Custom(NumberType::Lining) => feat(b"lnum", 1),
+ Smart::Custom(NumberType::OldStyle) => feat(b"onum", 1),
}
match features.numbers.width {
- NumberWidth::Auto => {}
- NumberWidth::Proportional => feat(b"pnum", 1),
- NumberWidth::Tabular => feat(b"tnum", 1),
+ Smart::Auto => {}
+ Smart::Custom(NumberWidth::Proportional) => feat(b"pnum", 1),
+ Smart::Custom(NumberWidth::Tabular) => feat(b"tnum", 1),
}
match features.numbers.position {