1use serde::{Deserialize, Serialize};
16
17use lalrpop_util::lalrpop_mod;
18lalrpop_mod!(script_syn);
19
20#[derive(Serialize, Deserialize, Debug)]
22pub struct Units(Vec<Unit>);
23
24impl core::ops::Deref for Units {
25 type Target = Vec<Unit>;
26 fn deref(&self) -> &Self::Target {
27 &self.0
28 }
29}
30
31impl core::ops::DerefMut for Units {
32 fn deref_mut(&mut self) -> &mut Self::Target {
33 &mut self.0
34 }
35}
36
37#[derive(Serialize, Deserialize)]
43pub enum Unit {
44 KeyValue(Key, Value),
45 SingleValue(Value),
46 Questioned(Key, Value),
47 Relation(Key, String, Value),
48}
49
50#[derive(Serialize, Deserialize, Debug)]
58pub enum Entry {
59 Ident(String),
60 RawStr(String),
61}
62
63#[derive(Serialize, Deserialize)]
65pub struct Key(Entry);
66
67impl core::ops::Deref for Key {
68 type Target = Entry;
69 fn deref(&self) -> &Self::Target {
70 &self.0
71 }
72}
73
74impl core::ops::DerefMut for Key {
75 fn deref_mut(&mut self) -> &mut Self::Target {
76 &mut self.0
77 }
78}
79
80#[derive(Serialize, Deserialize)]
85pub enum Value {
86 Empty,
87 Primitive(Entry),
88 Units(Box<Units>),
89}
90
91super::fn_parse_file!(Units, script_syn::UnitsParser);
92
93pub mod types {
94 pub use super::{Entry, Key, Unit, Units, Value};
98}
99
100impl core::fmt::Debug for Value {
103 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
104 match self {
105 Value::Empty => write!(f, "{{}}"),
106 Value::Primitive(v) => write!(f, "{:?}", v),
107 Value::Units(v) => write!(f, "{:#?}", v),
108 }
109 }
110}
111
112impl core::fmt::Debug for Unit {
113 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
114 match self {
115 Unit::KeyValue(k, v) => write!(f, "{:?} = {:?}", k.0, v),
116 Unit::SingleValue(v) => write!(f, "{:?}", v),
117 Unit::Questioned(k, v) => write!(f, "{:?} ?= {:?}", k.0, v),
118 Unit::Relation(k, r, v) => write!(f, "{:?} {} {:?}", k.0, r, v),
119 }
120 }
121}
122
123impl core::fmt::Display for Units {
127 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
128 self.recursive_write(f, 0)
129 }
130}
131
132impl Units {
133 pub fn recursive_write(&self, f: &mut std::fmt::Formatter<'_>, level: usize) -> std::fmt::Result {
134 for unit in &self.0 {
135 unit.recursive_write(f, level)?;
136 writeln!(f)?;
137 }
138 Ok(())
139 }
140}
141
142impl Unit {
143 fn recursive_write(&self, f: &mut std::fmt::Formatter<'_>, level: usize) -> std::fmt::Result {
144 write!(f, "{}", " ".repeat(level))?;
145 match self {
146 Unit::KeyValue(k, v) => {
147 write!(f, "{} = ", k.0)?;
148 v.recursive_write(f, level + 1)
149 }
150 Unit::SingleValue(v) => v.recursive_write(f, level + 1),
151 Unit::Questioned(k, v) => {
152 write!(f, "{} ?= ", k.0)?;
153 v.recursive_write(f, level + 1)
154 }
155 Unit::Relation(k, r, v) => {
156 write!(f, "{} {} ", k.0, r)?;
157 v.recursive_write(f, level + 1)
158 }
159 }
160 }
161}
162
163impl Value {
164 fn recursive_write(&self, f: &mut std::fmt::Formatter<'_>, level: usize) -> std::fmt::Result {
165 match self {
166 Value::Empty => write!(f, "{{}}"),
167 Value::Primitive(v) => write!(f, "{}", v),
168 Value::Units(v) => {
169 writeln!(f, "{{")?;
170 v.recursive_write(f, level + 1)?;
171 write!(f, "{}}}", " ".repeat(level.saturating_sub(1)))
172 }
173 }
174 }
175}
176
177impl core::fmt::Display for Entry {
178 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
179 match &self {
180 Entry::Ident(s) | Entry::RawStr(s) => write!(f, "{}", s),
181 }
182 }
183}