use super::*; use crate::layout::{Decoration, LineDecoration, LineKind}; /// `font`: Configure the font. pub fn font(ctx: &mut EvalContext, args: &mut Args) -> TypResult { struct FontDef(Rc>); struct FamilyDef(Rc>); castable! { FontDef: "font family or array of font families", Value::Str(string) => Self(Rc::new(vec![FontFamily::Named(string.to_lowercase())])), Value::Array(values) => Self(Rc::new( values .into_iter() .filter_map(|v| v.cast().ok()) .collect() )), @family: FontFamily => Self(Rc::new(vec![family.clone()])), } castable! { FamilyDef: "string or array of strings", Value::Str(string) => Self(Rc::new(vec![string.to_lowercase()])), Value::Array(values) => Self(Rc::new( values .into_iter() .filter_map(|v| v.cast().ok()) .map(|string: Str| string.to_lowercase()) .collect() )), } let list = args.named("family")?.or_else(|| { let families: Vec<_> = args.all().collect(); (!families.is_empty()).then(|| FontDef(Rc::new(families))) }); let size = args.named::("size")?.or_else(|| args.find()); let style = args.named("style")?; let weight = args.named("weight")?; let stretch = args.named("stretch")?; let fill = args.named("fill")?.or_else(|| args.find()); let top_edge = args.named("top-edge")?; let bottom_edge = args.named("bottom-edge")?; let serif = args.named("serif")?; let sans_serif = args.named("sans-serif")?; let monospace = args.named("monospace")?; let fallback = args.named("fallback")?; let body = args.find::