smt_scope/formatter/
deparse.rs1use 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}