sdml_core/model/constraints/formal/
values.rs1use crate::model::identifiers::IdentifierReference;
2use crate::model::values::{MappingValue, SimpleValue, ValueConstructor};
3use crate::model::{HasSourceSpan, Span};
4use std::fmt::Display;
5
6#[cfg(feature = "serde")]
7use serde::{Deserialize, Serialize};
8
9#[derive(Clone, Debug)]
14#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
15pub enum PredicateValue {
16 Simple(SimpleValue),
17 Sequence(SequenceOfPredicateValues),
18}
19
20#[derive(Clone, Debug, Default)]
21#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
22pub struct SequenceOfPredicateValues {
23 #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
24 span: Option<Span>,
25 values: Vec<PredicateSequenceMember>,
26}
27
28#[derive(Clone, Debug)]
29#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
30pub enum PredicateSequenceMember {
31 Simple(SimpleValue),
32 ValueConstructor(ValueConstructor),
33 Mapping(MappingValue),
34 Reference(IdentifierReference),
35}
36
37impl<T> From<T> for PredicateValue
42where
43 T: Into<SimpleValue>,
44{
45 fn from(v: T) -> Self {
46 Self::Simple(v.into())
47 }
48}
49
50impl From<SequenceOfPredicateValues> for PredicateValue {
51 fn from(v: SequenceOfPredicateValues) -> Self {
52 Self::Sequence(v)
53 }
54}
55
56impl PredicateValue {
57 pub const fn is_simple(&self) -> bool {
62 matches!(self, Self::Simple(_))
63 }
64
65 pub const fn as_simple(&self) -> Option<&SimpleValue> {
66 match self {
67 Self::Simple(v) => Some(v),
68 _ => None,
69 }
70 }
71
72 pub const fn is_sequence(&self) -> bool {
75 matches!(self, Self::Sequence(_))
76 }
77
78 pub const fn as_sequence(&self) -> Option<&SequenceOfPredicateValues> {
79 match self {
80 Self::Sequence(v) => Some(v),
81 _ => None,
82 }
83 }
84}
85
86impl From<Vec<PredicateSequenceMember>> for SequenceOfPredicateValues {
91 fn from(values: Vec<PredicateSequenceMember>) -> Self {
92 Self { span: None, values }
93 }
94}
95
96impl FromIterator<PredicateSequenceMember> for SequenceOfPredicateValues {
97 fn from_iter<T: IntoIterator<Item = PredicateSequenceMember>>(iter: T) -> Self {
98 Self::from(Vec::from_iter(iter))
99 }
100}
101
102impl Display for SequenceOfPredicateValues {
103 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
104 write!(
105 f,
106 "[{}]",
107 self.values
108 .iter()
109 .map(|v| v.to_string())
110 .collect::<Vec<String>>()
111 .join(" ")
112 )
113 }
114}
115
116impl HasSourceSpan for SequenceOfPredicateValues {
117 fn with_source_span(self, span: Span) -> Self {
118 let mut self_mut = self;
119 self_mut.span = Some(span);
120 self_mut
121 }
122
123 fn source_span(&self) -> Option<&Span> {
124 self.span.as_ref()
125 }
126
127 fn set_source_span(&mut self, span: Span) {
128 self.span = Some(span);
129 }
130
131 fn unset_source_span(&mut self) {
132 self.span = None;
133 }
134}
135
136impl SequenceOfPredicateValues {
137 pub fn is_empty(&self) -> bool {
138 self.values.is_empty()
139 }
140
141 pub fn len(&self) -> usize {
142 self.values.len()
143 }
144
145 pub fn iter(&self) -> impl Iterator<Item = &PredicateSequenceMember> {
146 self.values.iter()
147 }
148
149 pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut PredicateSequenceMember> {
150 self.values.iter_mut()
151 }
152
153 pub fn push<I>(&mut self, value: I)
154 where
155 I: Into<PredicateSequenceMember>,
156 {
157 self.values.push(value.into())
158 }
159
160 pub fn extend<I>(&mut self, extension: I)
161 where
162 I: IntoIterator<Item = PredicateSequenceMember>,
163 {
164 self.values.extend(extension)
165 }
166}
167
168impl<T> From<T> for PredicateSequenceMember
173where
174 T: Into<SimpleValue>,
175{
176 fn from(v: T) -> Self {
177 Self::Simple(v.into())
178 }
179}
180
181impl From<IdentifierReference> for PredicateSequenceMember {
182 fn from(v: IdentifierReference) -> Self {
183 Self::Reference(v)
184 }
185}
186
187impl Display for PredicateSequenceMember {
188 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
189 write!(
190 f,
191 "{}",
192 match self {
193 PredicateSequenceMember::Simple(v) => v.to_string(),
194 PredicateSequenceMember::ValueConstructor(v) => v.to_string(),
195 PredicateSequenceMember::Mapping(v) => v.to_string(),
196 PredicateSequenceMember::Reference(v) => v.to_string(),
197 }
198 )
199 }
200}
201
202impl PredicateSequenceMember {
203 pub const fn is_simple(&self) -> bool {
208 matches!(self, Self::Simple(_))
209 }
210
211 pub const fn as_simple(&self) -> Option<&SimpleValue> {
212 match self {
213 Self::Simple(v) => Some(v),
214 _ => None,
215 }
216 }
217
218 pub const fn is_reference(&self) -> bool {
221 matches!(self, Self::Reference(_))
222 }
223
224 pub const fn as_reference(&self) -> Option<&IdentifierReference> {
225 match self {
226 Self::Reference(v) => Some(v),
227 _ => None,
228 }
229 }
230}