diff --git a/output/src/op_align.rs b/output/src/op_align.rs index 95918bc4..80f58fd5 100644 --- a/output/src/op_align.rs +++ b/output/src/op_align.rs @@ -2,7 +2,7 @@ use crate::*; #[derive(Debug, Copy, Clone, Default)] pub enum Alignment { #[default] Center, X, Y, NW, N, NE, E, SE, S, SW, W } pub struct Align(Alignment, A); try_from_expr!(<'a, E>: Align>: |state, iter| { - if let Some((Token { value: Value::Key(key), .. }, _)) = iter.next() { + if let Some((Token { value: Value::Key(key), .. }, iter)) = iter.next() { match key { "align/c" => return Some(Self::c(state.get_content(&iter.next()?.0.value).expect("no content"))), "align/x" => return Some(Self::x(state.get_content(&iter.next()?.0.value).expect("no content"))), @@ -15,7 +15,7 @@ try_from_expr!(<'a, E>: Align>: |state, iter| { "align/ne" => return Some(Self::ne(state.get_content(&iter.next()?.0.value).expect("no content"))), "align/sw" => return Some(Self::sw(state.get_content(&iter.next()?.0.value).expect("no content"))), "align/se" => return Some(Self::se(state.get_content(&iter.next()?.0.value).expect("no content"))), - _ => {} + _ => return None } } }); diff --git a/output/src/op_bsp.rs b/output/src/op_bsp.rs index d20a6d3e..bb2342ed 100644 --- a/output/src/op_bsp.rs +++ b/output/src/op_bsp.rs @@ -32,36 +32,33 @@ impl, B: Content> Content for Bsp { } } try_from_expr!(<'a, E>: Bsp, RenderBox<'a, E>>: |state, iter| { - if let Some(Token { value: Value::Key(key), .. }) = iter.peek() { - let iter = iter.clone().next().unwrap().1; - match key { - "bsp/n" => return Some(Self::n( - state.get_content(&iter.next()?.0.value).expect("no south"), - state.get_content(&iter.next()?.0.value).expect("no north") - )), - "bsp/s" => return Some(Self::s( - state.get_content(&iter.next()?.0.value).expect("no north"), - state.get_content(&iter.next()?.0.value).expect("no south") - )), - "bsp/e" => return Some(Self::e( - state.get_content(&iter.next()?.0.value).expect("no west"), - state.get_content(&iter.next()?.0.value).expect("no east") - )), - "bsp/w" => return Some(Self::w( - state.get_content(&iter.next()?.0.value).expect("no east"), - state.get_content(&iter.next()?.0.value).expect("no west") - )), - "bsp/a" => return Some(Self::a( - state.get_content(&iter.next()?.0.value).expect("no above"), - state.get_content(&iter.next()?.0.value).expect("no below") - )), - "bsp/b" => return Some(Self::b( - state.get_content(&iter.next()?.0.value).expect("no above"), - state.get_content(&iter.next()?.0.value).expect("no below") - )), - _ => {} - } - } + Some(if let Some((Token { value: Value::Key("bsp/n"), .. }, iter)) = iter.next() { + let (s, iter) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no south provided"), iter)).expect("no south specified"); + let (n, _) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no north provided"), iter)).expect("no north specified"); + Self::n(s, n) + } else if let Some((Token { value: Value::Key("bsp/s"), .. }, iter)) = iter.next() { + let (n, iter) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no north provided"), iter)).expect("no north specified"); + let (s, _) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no south provided"), iter)).expect("no south specified"); + Self::s(n, s) + } else if let Some((Token { value: Value::Key("bsp/e"), .. }, iter)) = iter.next() { + let (w, iter) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no west provided"), iter)).expect("no west specified"); + let (e, _) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no east provided"), iter)).expect("no east specified"); + Self::e(w, e) + } else if let Some((Token { value: Value::Key("bsp/w"), .. }, iter)) = iter.next() { + let (e, iter) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no west provided"), iter)).expect("no west specified"); + let (w, _) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no east provided"), iter)).expect("no east specified"); + Self::w(e, w) + } else if let Some((Token { value: Value::Key("bsp/a"), .. }, iter)) = iter.next() { + let (a, iter) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no above provided"), iter)).expect("no above specified"); + let (b, _) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no below provided"), iter)).expect("no below specified"); + Self::a(a, b) + } else if let Some((Token { value: Value::Key("bsp/b"), .. }, iter)) = iter.next() { + let (a, iter) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no above provided"), iter)).expect("no above specified"); + let (b, _) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no below provided"), iter)).expect("no below specified"); + Self::b(a, b) + } else { + return None + }) }); impl Bsp { pub fn n (a: A, b: B) -> Self { Self(North, a, b) } diff --git a/output/src/op_transform.rs b/output/src/op_transform.rs index b089df75..dbcd0ca2 100644 --- a/output/src/op_transform.rs +++ b/output/src/op_transform.rs @@ -55,16 +55,16 @@ macro_rules! transform_xy_unit { fn try_from_expr (state: &'a T, iter: TokenIter<'a>) -> Option { Some(if let Some((Token { value: Value::Key($x), .. }, iter)) = iter.next() { let (x, iter) = iter.next().map(|(x, iter)|(state.get(&x.value).expect("no x provided"), iter)).expect("no x specified"); - let (c, _) = iter.next().map(|(x, iter)|(state.get_content(&x.value).expect("no content provided"), iter)).expect("no content specified"); + let (c, _) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no content provided"), iter)).expect("no content specified"); Self::x(x, c) } else if let Some((Token { value: Value::Key($y), .. }, iter)) = iter.next() { let (y, iter) = iter.next().map(|(y, iter)|(state.get(&y.value).expect("no y provided"), iter)).expect("no y specified"); - let (c, _) = iter.next().map(|(x, iter)|(state.get_content(&x.value).expect("no content provided"), iter)).expect("no content specified"); + let (c, _) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no content provided"), iter)).expect("no content specified"); Self::y(y, c) } else if let Some((Token { value: Value::Key($xy), .. }, iter)) = iter.next() { let (x, iter) = iter.next().map(|(x, iter)|(state.get(&x.value).expect("no x provided"), iter)).expect("no x specified"); let (y, iter) = iter.next().map(|(y, iter)|(state.get(&y.value).expect("no y provided"), iter)).expect("no y specified"); - let (c, _) = iter.next().map(|(x, iter)|(state.get_content(&x.value).expect("no content provided"), iter)).expect("no content specified"); + let (c, _) = iter.next().map(|(c, iter)|(state.get_content(&c.value).expect("no content provided"), iter)).expect("no content specified"); Self::xy(x, y, c) } else { return None