1use crate::ast::*;
5use crate::core::Id;
6use crate::dsl::*;
7
8#[derive(Debug, PartialEq, Clone)]
9pub enum ActionQualifier {
10 N,
11 R,
12 S,
13 P,
14}
15
16impl ActionQualifier {
17 pub fn from_char(l: char) -> ActionQualifier {
18 match l {
19 'N' => return ActionQualifier::N,
20 'R' => return ActionQualifier::R,
21 'S' => return ActionQualifier::S,
22 'P' => return ActionQualifier::P,
23 _ => panic!(),
25 }
26 }
27}
28
29#[derive(Debug, PartialEq, Clone)]
30pub struct ActionAssociation {
31 pub name: Id,
32 pub qualifier: Option<ActionQualifier>,
33 pub indicators: Vec<Id>,
34}
35
36impl ActionAssociation {
37 pub fn new(name: &str, qualifier: Option<ActionQualifier>) -> ActionAssociation {
38 ActionAssociation {
39 name: Id::from(name),
40 qualifier: qualifier,
41 indicators: vec![],
42 }
43 }
44}
45
46#[derive(Debug, PartialEq, Clone)]
47pub enum Element {
48 Action {
49 name: Id,
50 body: FunctionBlockBody,
51 },
52
53 Transition {
54 name: Option<Id>,
55 priority: Option<u32>,
56 from: Vec<Id>,
57 to: Vec<Id>,
58 condition: ExprKind,
59 },
60
61 Step {
62 name: Id,
63 action_associations: Vec<ActionAssociation>,
64 },
65
66 InitialStep {
67 name: Id,
68 action_associations: Vec<ActionAssociation>,
69 },
70}
71
72impl Element {
73 pub fn action(name: &str, body: Vec<StmtKind>) -> Element {
74 Element::Action {
75 name: Id::from(name),
76 body: FunctionBlockBody::Statements(Statements { body: body }),
77 }
78 }
79
80 pub fn transition(from: &str, to: &str, condition: ExprKind) -> Element {
81 Element::Transition {
82 name: None,
83 priority: None,
84 from: vec![Id::from(from)],
85 to: vec![Id::from(to)],
86 condition: condition,
87 }
88 }
89}
90
91#[derive(Debug, PartialEq, Clone)]
92pub struct Network {
93 pub initial_step: Element,
94 pub elements: Vec<Element>,
95}