1pub(crate) mod check;
12pub(crate) mod emitter;
13mod member;
14pub(crate) mod parser;
15
16pub(crate) mod reconciliation;
17pub(crate) mod schema;
18pub(crate) mod table;
19
20#[derive(Debug, Clone, Copy, Hash)]
22pub enum PathPart<'a> {
23 Part(&'a str),
26 Team,
28 Hero,
30}
31
32impl<'b> PartialEq<PathPart<'b>> for PathPart<'_> {
33 fn eq(&self, other: &PathPart<'b>) -> bool {
34 match (self, other) {
35 (PathPart::Part(left), PathPart::Part(right)) => left == right,
36 (PathPart::Team, PathPart::Team) => true,
37 (PathPart::Hero, PathPart::Hero) => true,
38 _ => false,
39 }
40 }
41}
42
43impl Eq for PathPart<'_> {}
44
45pub use check::{
46 DiagnosticSeverity, SettingsDiagnostic, check_emission, check_emission_diagnostics,
47};
48pub use schema::{
49 Applicability, EffectiveNumber, NumericBounds, NumericBoundsError, SettingDefinition,
50 SettingEnumMember, SettingId, SettingIdentity, SettingOccurrence, SettingOperationError,
51 SettingPresentation, SettingScope, SettingSource, SettingSourceEdit, SettingSourceKind,
52 SettingTarget, SettingTargetKind, SettingValue, SettingValueDomain, TeamId, definition,
53 definitions, definitions_by_id, validate_catalog,
54};
55pub use table::{LocalizedSettingName, localized_setting_names};
56
57use crate::core::source::Span;
58
59#[derive(Debug, Clone)]
61pub struct Settings {
62 pub span: Option<Span>,
63 pub children: Vec<SettingsNode>,
64}
65
66#[derive(Debug, Clone)]
68pub enum SettingsNode {
69 Workshop {
71 children: Vec<SettingsNode>,
72 span: Option<Span>,
73 },
74 Group {
75 name: String,
76 children: Vec<SettingsNode>,
77 span: Option<Span>,
78 },
79 Number {
80 name: String,
81 value: f64,
82 span: Option<Span>,
83 },
84 Bool {
85 name: String,
86 value: bool,
87 span: Option<Span>,
88 },
89 Flag { name: String, span: Option<Span> },
91 String {
92 name: String,
93 value: String,
94 span: Option<Span>,
95 },
96 List {
97 name: String,
98 elements: Vec<SettingsListElement>,
99 span: Option<Span>,
100 },
101 Raw {
105 name: String,
106 value: String,
107 span: Option<Span>,
108 },
109 RawValue {
115 name: String,
116 value: String,
117 span: Option<Span>,
118 },
119 RawGroup {
126 name: String,
127 children: Vec<SettingsNode>,
128 span: Option<Span>,
129 },
130}
131
132#[derive(Debug, Clone)]
134pub struct SettingsListElement {
135 pub value: String,
136 pub span: Option<Span>,
137}
138
139impl SettingsListElement {
140 fn clear_span(&mut self) {
141 self.span = None;
142 }
143}
144
145impl Settings {
146 pub(crate) fn clear_spans(&mut self) {
153 self.span = None;
154 for node in &mut self.children {
155 node.clear_spans();
156 }
157 }
158}
159
160impl SettingsNode {
161 pub fn span(&self) -> Option<Span> {
163 match self {
164 SettingsNode::Workshop { span, .. }
165 | SettingsNode::Group { span, .. }
166 | SettingsNode::Number { span, .. }
167 | SettingsNode::Bool { span, .. }
168 | SettingsNode::Flag { span, .. }
169 | SettingsNode::String { span, .. }
170 | SettingsNode::List { span, .. }
171 | SettingsNode::Raw { span, .. }
172 | SettingsNode::RawValue { span, .. }
173 | SettingsNode::RawGroup { span, .. } => *span,
174 }
175 }
176
177 fn clear_spans(&mut self) {
179 match self {
180 SettingsNode::Workshop { children, span }
181 | SettingsNode::Group { children, span, .. }
182 | SettingsNode::RawGroup { children, span, .. } => {
183 *span = None;
184 for node in children {
185 node.clear_spans();
186 }
187 }
188 SettingsNode::Number { span, .. }
189 | SettingsNode::Bool { span, .. }
190 | SettingsNode::Flag { span, .. }
191 | SettingsNode::String { span, .. }
192 | SettingsNode::Raw { span, .. }
193 | SettingsNode::RawValue { span, .. } => *span = None,
194 SettingsNode::List { elements, span, .. } => {
195 *span = None;
196 for element in elements {
197 element.clear_span();
198 }
199 }
200 }
201 }
202
203 pub fn name(&self) -> &str {
205 match self {
206 SettingsNode::Workshop { .. } => "workshop",
207 SettingsNode::Group { name, .. }
208 | SettingsNode::Number { name, .. }
209 | SettingsNode::Bool { name, .. }
210 | SettingsNode::Flag { name, .. }
211 | SettingsNode::String { name, .. }
212 | SettingsNode::List { name, .. }
213 | SettingsNode::Raw { name, .. }
214 | SettingsNode::RawValue { name, .. }
215 | SettingsNode::RawGroup { name, .. } => name,
216 }
217 }
218}