object_rainbow/
default_chain.rs1use 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}