Skip to main content

object_rainbow/
default_chain.rs

1use crate::*;
2
3#[derive(Default, Tagged, ListHashes, Topological, Clone, Copy)]
4pub struct DefaultChain<A, B>(A, B);
5
6impl<A, B: Default> DefaultChain<A, B> {
7    pub fn from_first(first: A) -> Self {
8        Self(first, Default::default())
9    }
10}
11
12impl<A: Default, B> DefaultChain<A, B> {
13    pub fn from_second(second: B) -> Self {
14        Self(Default::default(), second)
15    }
16}
17
18impl<A: InlineOutput + Default + PartialEq, B: ToOutput + Default> ToOutput for DefaultChain<A, B> {
19    fn to_output(&self, output: &mut impl crate::Output) {
20        self.0.to_output(output);
21        if self.0 == A::default() {
22            self.1.to_output(output);
23        }
24    }
25}
26
27impl<A: InlineOutput + Default + PartialEq, B: InlineOutput + Default> InlineOutput
28    for DefaultChain<A, B>
29{
30}
31
32impl<A: ParseInline<I> + PartialEq + Default, B: Parse<I> + Default, I: ParseInput> Parse<I>
33    for DefaultChain<A, B>
34{
35    fn parse(mut input: I) -> crate::Result<Self> {
36        let a = input.parse_inline()?;
37        let b = if a == A::default() {
38            input.parse()?
39        } else {
40            input.empty()?;
41            Default::default()
42        };
43        Ok(Self(a, b))
44    }
45}
46
47impl<A: ParseInline<I> + PartialEq + Default, B: ParseInline<I> + Default, I: ParseInput>
48    ParseInline<I> for DefaultChain<A, B>
49{
50    fn parse_inline(input: &mut I) -> crate::Result<Self> {
51        let a = input.parse_inline()?;
52        let b = if a == A::default() {
53            input.parse_inline()?
54        } else {
55            Default::default()
56        };
57        Ok(Self(a, b))
58    }
59}