1use crate::{
10 aim::{ContextLike, Typedef, Writer, WriterLike, parse_typedef},
11 expressions::{
12 Expression, ExpressionLike, parse_arc_identifier, parse_branch, parse_closure, parse_expression, parse_retry, statically_evaluate
13 },
14 values::{Errata, Instance, Node, Value, parse_eval, parse_format, parse_instance, parse_node, parse_value},
15};
16use anyhow::{Result, anyhow};
17use bitflags::bitflags;
18use nom::{
19 Finish, IResult, Parser,
20 character::complete::{char, multispace0},
21 sequence::{delimited},
22 error::{Error, ErrorKind}
23};
24use std::{
25 fmt,
26 sync::Arc,
27};
28
29bitflags! {
32 #[derive(Debug, Clone, PartialEq)]
34 struct Flags: usize {
35 const IS_MODIFIER = 0b1;
37 const IS_ASSIGNMENT = 0b10;
39 const IS_STATIC = 0b100;
41 }
42}
43
44pub fn is_uppercase(s: &str) -> bool {
46 s.chars().all(|c| !c.is_alphabetic() || c.is_uppercase())
47}
48
49pub fn is_lowercase(s: &str) -> bool {
51 s.chars().all(|c| !c.is_alphabetic() || c.is_lowercase())
52}
53
54pub fn test_for_modifier(identifier: &str) -> bool {
56 if is_uppercase(identifier) {
57 true
58 } else {
59 false
60 }
61}
62
63pub fn test_for_assignment(identifier: &str) -> bool {
65 if is_lowercase(identifier) {
66 true
67 } else {
68 false
69 }
70}
71
72fn init_flags(identifier: &str) -> Flags {
74 let mut flags = Flags::empty();
75 if test_for_modifier(&identifier) {
76 flags.insert(Flags::IS_MODIFIER);
77 }
78 if test_for_assignment(&identifier) {
79 flags.insert(Flags::IS_ASSIGNMENT);
80 }
81 flags
82}
83
84#[derive(Debug, Clone, PartialEq)]
91pub struct Rule {
92 identifier: Arc<str>,
94 typedef: Typedef,
96 expression: Expression,
98 value: Arc<Value>,
100 flags: Flags,
102}
103
104impl Rule {
105 pub fn new(identifier: Arc<str>, typedef: Typedef, expression: Expression, value: Arc<Value>) -> Self {
120 let mut flags = init_flags(&identifier);
121 if expression.is_empty() || expression.is_branch() || expression.is_retry() {
122 Self {
123 identifier,
124 typedef,
125 expression,
126 value,
127 flags,
128 }
129 } else {
130 let (static_exp, static_val) = match statically_evaluate(&expression) {
131 Ok(value) => {
132 flags.insert(Flags::IS_STATIC);
133 (Expression::Empty, value)
134 }
135 _ => (expression, Value::empty()),
136 };
137 Self {
138 identifier,
139 typedef,
140 expression: static_exp,
141 value: static_val,
142 flags,
143 }
144 }
145 }
146
147 pub fn convert(identifier: Arc<str>, typedef: Arc<str>, formula: Arc<str>, value: Arc<str>) -> Self {
148 Self::new(
149 identifier,
150 Typedef::convert(&typedef),
151 Expression::convert(&formula),
152 Value::convert(value)
153 )
154 }
155
156 pub fn parse(&self, input: &str) -> Self {
173 let identifier = self.identifier.clone();
174 let typedef = self.typedef.clone();
175 match parse_rule_operands(input, &self.typedef) {
176 Ok((_, (expression, value))) => Self::new(identifier, typedef, expression, value),
177 Err(nom::Err::Incomplete(_)) => {
178 let expression = Errata::new_expression(
179 Arc::from("Incomplete Expression"),
180 Arc::from(input),
181 );
182 Self::new(identifier, typedef, expression, Value::empty())
183 }
184 Err(nom::Err::Error(e)) | Err(nom::Err::Failure(e)) => {
185 let expression = Errata::new_expression_location(
186 Arc::from(format!("Syntax Error ({})", e)),
187 Arc::from(input),
188 Arc::from(e.input),
189 );
190 Self::new(identifier, typedef, expression, Value::empty())
191 }
192 }
193 }
194
195 pub fn is_empty(&self) -> bool {
197 if self.expression.is_empty() && self.value.is_empty() {
198 true
199 } else {
200 false
201 }
202 }
203
204 pub fn is_error(&self) -> bool {
206 self.value.is_error() | self.expression.is_error()
207 }
208
209 pub fn has_expression(&self) -> bool {
211 match &self.expression {
212 Expression::Empty | Expression::Errata { .. } => false,
213 _ => true,
214 }
215 }
216
217 pub fn identifier(&self) -> Arc<str> {
219 self.identifier.clone()
220 }
221
222 pub fn ucid(&self) -> Arc<str> {
227 Arc::from(self.identifier.to_uppercase())
228 }
229
230 pub fn lcid(&self) -> Arc<str> {
235 Arc::from(self.identifier.to_lowercase())
236 }
237
238 pub fn set_identifier(&mut self, identifier: Arc<str>) -> bool {
242 if self.identifier != identifier {
244 if test_for_modifier(&identifier) {
246 self.flags.insert(Flags::IS_MODIFIER);
247 } else {
248 self.flags.remove(Flags::IS_MODIFIER);
249 }
250 if test_for_assignment(&identifier) {
251 self.flags.insert(Flags::IS_ASSIGNMENT);
252 } else {
253 self.flags.remove(Flags::IS_ASSIGNMENT);
254 }
255 self.identifier = identifier;
256 true
257 } else {
258 false
259 }
260 }
261
262 pub fn is_modifier(&self) -> bool {
264 self.flags.contains(Flags::IS_MODIFIER)
265 }
266
267 pub fn is_assignment(&self) -> bool {
269 self.flags.contains(Flags::IS_ASSIGNMENT)
270 }
271
272 pub fn typedef(&self) -> &Typedef {
274 &self.typedef
275 }
276
277 pub fn set_typedef(&mut self, typedef: Typedef) -> bool {
284 if self.typedef != typedef {
285 match self.value.clone().to_type(&typedef) {
286 Ok(value) => self.value = value,
287 _ => self.value = Value::empty(),
288 }
289 self.typedef = typedef;
290 true
291 } else {
292 false
293 }
294 }
295
296 pub fn expression(&self) -> &Expression {
298 &self.expression
299 }
300
301 pub fn set_expression(&mut self, expression: Expression) -> bool {
308 if self.expression.to_formula() != expression.to_formula() {
309 self.expression = expression;
310 true
311 } else {
312 false
313 }
314 }
315
316 pub fn value(&self) -> Arc<Value> {
318 self.value.clone()
319 }
320
321 pub fn set_value(&mut self, value: Arc<Value>) -> Result<()> {
331 if !self.typedef.is_special() && (value.is_empty() || value.is_error() || value.is_of_type(&self.typedef)) {
332 self.value = value;
333 Ok(())
334 } else {
335 Err(anyhow!(
336 "Type mismatch, expecting {} found {}",
337 self.typedef.as_str(),
338 value.type_as_string()
339 ))
340 }
341 }
342
343 pub fn rename_node(&self, identifier: Arc<str>) -> Result<Self> {
344 if self.is_node() {
346 if let Some(old_node) = self.get_node() {
347 let old_reference = old_node.reference()?;
349 let new_reference = Arc::new(old_reference.rename_child(identifier.clone()));
350 let new_node = Node::init_new(new_reference, old_node.inference());
352 let value = Arc::new(Value::Node(new_node));
354 Ok(Rule::new(identifier, self.typedef.clone(), Expression::Empty, value))
356 } else {
357 Err(anyhow!("Node missing from Rule {}", self.identifier))
358 }
359 } else {
360 Err(anyhow!("Type mismatch, expecting Node found {}", self.typedef.as_str()))
361 }
362 }
363 pub fn is_format(&self) -> bool {
365 self.typedef.is_format() && self.value.is_format()
366 }
367
368 pub fn is_eval(&self) -> bool {
370 self.typedef.is_eval() && self.value.is_eval()
371 }
372
373 pub fn set_pass(&mut self) -> Result<()> {
380 let value = self.value.to_pass()?;
381 self.set_value(Arc::new(value))
382 }
383
384 pub fn set_fail(&mut self) -> Result<()> {
391 let value = self.value.to_fail()?;
392 self.set_value(Arc::new(value))
393 }
394
395 pub fn is_node(&self) -> bool {
397 self.typedef.is_node() && self.value.is_node()
398 }
399
400 pub fn get_node(&self) -> Option<Node> {
405 self.value.get_node()
406 }
407
408 pub fn get_instance(&self) -> Option<Instance> {
409 self.value.get_instance()
410 }
411
412 pub fn print(&self, writer: &mut Writer) {
416 writer.write_str(&self.identifier);
417 writer.write_str(": ");
418 self.typedef.print(writer);
419 writer.write_str(" = ");
420 if self.expression.is_empty() {
421 if self.value.is_constant() {
422 writer.write_char('$');
423 }
424 self.value.print(writer);
425 } else {
426 self.expression.print(writer);
427 if self.value.is_constant() {
428 writer.write_str(" $");
429 self.value.print(writer);
430 }
431 }
432 }
433
434}
435
436pub fn parse_rule(input: &str) -> Result<Rule> {
439 match parse_rule_elements(input).finish() {
440 Ok((_, rule)) => Ok(rule),
441 Err(e) => Err(anyhow!("Parse error: {}", e)),
442 }
443}
444
445fn parse_rule_elements(input: &str) -> IResult<&str, Rule> {
448 let (input, (_, identifier, _, typedef, _)) = (
449 multispace0,
450 parse_arc_identifier,
451 delimited(multispace0, char(':'), multispace0),
452 parse_typedef,
453 delimited(multispace0, char('='), multispace0),
454 ).parse(input)?;
455 let (input, (expression, value)) = parse_rule_operands(input, &typedef)?;
456
457 Ok((input, Rule::new(identifier, typedef, expression, value)))
458}
459
460fn parse_rule_operands<'a>(
462 input: &'a str,
463 typedef: &Typedef,
464) -> IResult<&'a str, (Expression, Arc<Value>)> {
465 let input = input.trim(); let (input, value) = if input.is_empty() {
470 if typedef.is_format() || typedef.is_instance() {
472 return Err(nom::Err::Error(Error::new(input, ErrorKind::Fail)));
474 } else if typedef.is_node() {
475 let node = Node::default();
477 (input, Arc::new(Value::Node(node)))
478 } else {
479 (input, Value::empty())
480 }
481 } else if input.starts_with('$') {
482 let (input, _) = char('$')(input)?;
484 let (input, value) = parse_value(input)?;
485 (input, value)
486 } else if typedef.is_closure() {
487 let (input, closure) = parse_closure(input)?;
489 (input, Arc::new(Value::Closure(Arc::new(closure))))
490 } else if typedef.is_eval() {
491 let (input, eval) = parse_eval(input)?;
493 (input, Arc::new(Value::Eval(eval)))
494 } else if typedef.is_format() {
495 let (input, format) = parse_format(input)?;
497 (input, Arc::new(Value::Format(format)))
498 } else if typedef.is_instance() {
499 let (input, instance) = parse_instance(input)?;
501 (input, Arc::new(Value::Instance(instance)))
502 } else if typedef.is_node() {
503 let (input, node) = parse_node(input)?;
505 (input, Arc::new(Value::Node(node)))
506 } else {
507 let (input, expression) = if typedef.is_branch() {
509 let (input, branch) = parse_branch(input)?;
510 (input, Expression::Branch(branch))
511 } else if typedef.is_retry() {
512 let (input, retry) = parse_retry(input)?;
513 (input, Expression::Retry(retry))
514 } else {
515 parse_expression(input)?
517 };
518 let (input, _) = multispace0(input)?; let (input, value) = if input.starts_with('$') {
520 let (input, _) = char('$')(input)?;
521 let (input, value) = parse_value(input)?;
522 (input, value)
523 } else {
524 (input, Value::empty())
525 };
526 return Ok((input, (expression, value)));
527 };
528 Ok((input, (Expression::Empty, value)))
529}
530
531impl ExpressionLike for Rule {
532 fn evaluate(&self, context: &mut dyn ContextLike) -> Result<Arc<Value>> {
559 if self.expression.is_empty() {
560 Ok(self.value.clone())
561 } else {
562 self.expression.evaluate(context)
563 }
564 }
565
566 fn to_formula(&self) -> String {
568 let mut writer = Writer::formulizer();
569 self.print(&mut writer);
570 writer.finish()
571 }
572}
573
574impl WriterLike for Rule {
575 fn write(&self, writer: &mut Writer) {
576 self.print(writer);
577 }
578}
579
580impl fmt::Display for Rule {
581 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
583 let mut writer = Writer::formulizer();
584 if self.value.is_empty() {
585 self.expression.print(&mut writer);
586 } else {
587 self.value.print(&mut writer);
588 }
589 write!(f, "{}", writer.finish())
590 }
591}