okane_core/syntax/
decoration.rs1use std::{borrow::Cow, fmt::Debug};
5
6pub trait AsUndecorated<T: ?Sized> {
9 fn as_undecorated(&self) -> &T;
10}
11
12pub trait Decoration: 'static {
16 type Decorated<T>: AsUndecorated<T> + Debug + PartialEq + Eq
17 where
18 T: AsUndecorated<T> + Debug + PartialEq + Eq;
19
20 fn decorate_parser<PIn, I, O, E>(parser: PIn) -> impl winnow::Parser<I, Self::Decorated<O>, E>
21 where
22 I: winnow::stream::Stream + winnow::stream::Location,
23 O: AsUndecorated<O> + Debug + PartialEq + Eq,
24 PIn: winnow::Parser<I, O, E>;
25}
26
27macro_rules! define_as_undecorated {
28 ([$($impl_generics:tt)*],
29 $type_name:ty) => {
30 impl<$($impl_generics)*> AsUndecorated<$type_name> for $type_name {
31 fn as_undecorated(&self) -> &$type_name {
32 self
33 }
34 }
35 };
36}
37
38define_as_undecorated!(['i], Cow<'i, str>);
39define_as_undecorated!(['i], &'i str);
40define_as_undecorated!(['i, Deco: Decoration], super::LedgerEntry<'i, Deco>);
41define_as_undecorated!(['i, Deco: Decoration], super::Transaction<'i, Deco>);
42define_as_undecorated!(['i, Deco: Decoration], super::Posting<'i, Deco>);
43define_as_undecorated!(['i, Deco: Decoration], super::PostingAmount<'i, Deco>);
44define_as_undecorated!(['i], super::Exchange<'i>);
45define_as_undecorated!(['i], super::expr::ValueExpr<'i>);