smt_scope/formatter/
deparse.rs

1use core::fmt;
2
3use super::defns::*;
4
5pub struct DeParse<D: DeParseTrait>(pub D);
6
7impl<D: DeParseTrait> fmt::Display for DeParse<D> {
8    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9        self.0.deparse(f)
10    }
11}
12
13pub trait DeParseTrait: Copy {
14    fn deparse_string(self) -> String {
15        DeParse(self).to_string()
16    }
17    fn deparse(self, f: &mut fmt::Formatter) -> fmt::Result;
18}
19
20impl DeParseTrait for &'_ Matcher {
21    fn deparse(self, f: &mut fmt::Formatter) -> fmt::Result {
22        if self.children.is_some() {
23            write!(f, "(")?;
24        }
25        self.kind.deparse(f)?;
26        if let Some(children) = &self.children {
27            for _ in 0..children.get() {
28                write!(f, " _")?;
29            }
30            write!(f, ")")?;
31        }
32        Ok(())
33    }
34}
35
36impl DeParseTrait for &'_ MatcherKind {
37    fn deparse(self, f: &mut fmt::Formatter) -> fmt::Result {
38        match self {
39            MatcherKind::Exact(s) => write!(f, "{s}"),
40            MatcherKind::Regex(r) => {
41                write!(f, "/")?;
42                let original = r.original();
43                let no_prefix = original.strip_prefix("^(?:").unwrap_or(original);
44                let no_suffix = no_prefix.strip_suffix(")$").unwrap_or(no_prefix);
45                write!(f, "{no_suffix}")?;
46                write!(f, "/")
47            }
48        }
49    }
50}
51
52impl DeParseTrait for &'_ Formatter {
53    fn deparse(self, f: &mut fmt::Formatter) -> fmt::Result {
54        if self.bind_power.left != DEFAULT_BIND_POWER {
55            write!(
56                f,
57                "{CONTROL_CHARACTER}{}{CONTROL_CHARACTER}",
58                self.bind_power.left as i32
59            )?;
60        }
61        for o in &self.outputs {
62            o.deparse(f)?;
63        }
64        if self.bind_power.right != DEFAULT_BIND_POWER {
65            write!(
66                f,
67                "{CONTROL_CHARACTER}{}{CONTROL_CHARACTER}",
68                self.bind_power.right as i32
69            )?;
70        }
71        Ok(())
72    }
73}
74
75impl DeParseTrait for &'_ SubFormatter {
76    fn deparse(self, f: &mut fmt::Formatter) -> fmt::Result {
77        match self {
78            SubFormatter::String(s) => write!(f, "{}", duplicate_character(s, CONTROL_CHARACTER)),
79            SubFormatter::Single {
80                path,
81                index,
82                bind_power,
83            } => write!(
84                f,
85                "{CONTROL_CHARACTER}[#{path}{index}{SEPARATOR_CHARACTER}{}]{CONTROL_CHARACTER}",
86                DeParse(bind_power)
87            ),
88            SubFormatter::Repeat(r) => {
89                write!(f, "{CONTROL_CHARACTER}(")?;
90                r.deparse(f)?;
91                write!(f, "){CONTROL_CHARACTER}")
92            }
93            SubFormatter::Capture(c) => write!(f, "{CONTROL_CHARACTER}{{{c}}}{CONTROL_CHARACTER}"),
94        }
95    }
96}
97
98fn duplicate_character(s: &str, c: char) -> String {
99    s.replace(c, &String::from_iter([c, c]))
100}
101
102impl DeParseTrait for &'_ BindPowerPair {
103    fn deparse(self, f: &mut fmt::Formatter) -> fmt::Result {
104        if self.left == self.right {
105            write!(f, "{}", self.left as i32)
106        } else {
107            write!(f, "{},{}", self.left as i32, self.right as i32)
108        }
109    }
110}
111
112impl DeParseTrait for &'_ SubFormatterRepeat {
113    fn deparse(self, f: &mut fmt::Formatter) -> fmt::Result {
114        let path = &self.path;
115        let from = self.from;
116        let to = self.to;
117        let left = self.left as i32;
118        let middle = DeParse(&self.middle);
119        let right = self.right as i32;
120        write!(f, "#{path}{from}..{to}{SEPARATOR_CHARACTER}{left}{SEPARATOR_CHARACTER}{middle}{SEPARATOR_CHARACTER}{right}{CONTROL_CHARACTER}")?;
121        let left_sep =
122            duplicate_character(&DeParse(&self.left_sep).to_string(), SEPARATOR_CHARACTER);
123        write!(f, "{left_sep}")?;
124        write!(f, "{SEPARATOR_CHARACTER}")?;
125        let middle_sep =
126            duplicate_character(&DeParse(&self.middle_sep).to_string(), SEPARATOR_CHARACTER);
127        write!(f, "{middle_sep}")?;
128        write!(f, "{SEPARATOR_CHARACTER}")?;
129        let right_sep =
130            duplicate_character(&DeParse(&self.right_sep).to_string(), SEPARATOR_CHARACTER);
131        write!(f, "{right_sep}")?;
132        Ok(())
133    }
134}
135
136impl fmt::Display for ChildPath {
137    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
138        for p in &self.0 {
139            write!(f, "{p}:")?;
140        }
141        Ok(())
142    }
143}
144
145impl fmt::Display for ChildIndex {
146    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
147        write!(f, "{}", self.0)
148    }
149}