diff options
| author | Laurenz <laurmaedje@gmail.com> | 2019-12-15 15:09:09 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2019-12-15 15:09:09 +0100 |
| commit | f3e461b27c70d34e12f3bcb11cc340a88fc7f102 (patch) | |
| tree | 5d8e21f21aa918bd5ca2c2c8654564f25ab4cd6d /src/syntax | |
| parent | 3677e4a97dd08252e2e1172ac60a5ab958f8ee16 (diff) | |
Paper styles and scalable+default margins 📜
Diffstat (limited to 'src/syntax')
| -rw-r--r-- | src/syntax/mod.rs | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/syntax/mod.rs b/src/syntax/mod.rs index 57488121..bf395c2b 100644 --- a/src/syntax/mod.rs +++ b/src/syntax/mod.rs @@ -235,13 +235,17 @@ debug_display!(Expression); pub struct Ident(pub String); impl Ident { - fn new(string: String) -> ParseResult<Ident> { + pub fn new(string: String) -> ParseResult<Ident> { if is_identifier(&string) { Ok(Ident(string)) } else { error!("invalid identifier: `{}`", string); } } + + pub fn as_str(&self) -> &str { + self.0.as_str() + } } impl Display for Ident { @@ -317,3 +321,18 @@ impl<T> ExpressionKind for Spanned<T> where T: ExpressionKind { .map(|v| Spanned::new(v, span)) } } + +impl<T> ExpressionKind for Option<T> where T: ExpressionKind { + const NAME: &'static str = T::NAME; + + fn from_expr(expr: Spanned<Expression>) -> ParseResult<Option<T>> { + if let Expression::Ident(ident) = &expr.v { + match ident.as_str() { + "default" | "none" => return Ok(None), + _ => {}, + } + } + + T::from_expr(expr).map(|v| Some(v)) + } +} |
