diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-11-22 14:30:43 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-11-29 16:47:35 +0100 |
| commit | ed50661378f356e02c6ec943bc4840091d33cfbd (patch) | |
| tree | 7ed51339ea1a4b7ccc4308c902b36e86f9c07e26 /src/library | |
| parent | cef46e6c40fed0089a20e44ff2f251c06878891c (diff) | |
Castable optional and smart values
Diffstat (limited to 'src/library')
| -rw-r--r-- | src/library/deco.rs | 2 | ||||
| -rw-r--r-- | src/library/mod.rs | 8 | ||||
| -rw-r--r-- | src/library/page.rs | 24 | ||||
| -rw-r--r-- | src/library/shape.rs | 6 | ||||
| -rw-r--r-- | src/library/text.rs | 27 |
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 { |
