1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, PartialEq)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub struct DotRoot {
10 pub graphs: Vec<Graph>,
11}
12
13#[derive(Debug, Clone, PartialEq)]
15#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16pub struct Graph {
17 pub strict: bool,
18 pub graph_type: GraphType,
19 pub id: Option<String>,
20 pub statements: Vec<Statement>,
21 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
22 pub span: Range<usize>,
23}
24
25#[derive(Debug, Clone, PartialEq)]
27#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
28pub enum GraphType {
29 Graph,
30 Digraph,
31}
32
33#[derive(Debug, Clone, PartialEq)]
35#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
36pub enum Statement {
37 Node(NodeStatement),
38 Edge(EdgeStatement),
39 Attribute(AttributeStatement),
40 Subgraph(SubgraphStatement),
41 Assignment(AssignmentStatement),
42}
43
44#[derive(Debug, Clone, PartialEq)]
46#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
47pub struct NodeStatement {
48 pub node_id: NodeId,
49 pub attributes: Vec<Attribute>,
50 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
51 pub span: Range<usize>,
52}
53
54#[derive(Debug, Clone, PartialEq)]
56#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
57pub struct EdgeStatement {
58 pub left: EdgeOperand,
59 pub edges: Vec<(EdgeOp, EdgeOperand)>,
60 pub attributes: Vec<Attribute>,
61 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
62 pub span: Range<usize>,
63}
64
65#[derive(Debug, Clone, PartialEq)]
67#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
68pub enum EdgeOperand {
69 Node(NodeId),
70 Subgraph(SubgraphStatement),
71}
72
73#[derive(Debug, Clone, PartialEq)]
75#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
76pub enum EdgeOp {
77 Directed, Undirected, }
80
81#[derive(Debug, Clone, PartialEq)]
83#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
84pub struct AttributeStatement {
85 pub target: AttributeTarget,
86 pub attributes: Vec<Attribute>,
87 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
88 pub span: Range<usize>,
89}
90
91#[derive(Debug, Clone, PartialEq)]
93#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
94pub enum AttributeTarget {
95 Graph,
96 Node,
97 Edge,
98}
99
100#[derive(Debug, Clone, PartialEq)]
102#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
103pub struct SubgraphStatement {
104 pub id: Option<String>,
105 pub statements: Vec<Statement>,
106 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
107 pub span: Range<usize>,
108}
109
110#[derive(Debug, Clone, PartialEq)]
112#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
113pub struct AssignmentStatement {
114 pub id: String,
115 pub value: String,
116 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
117 pub span: Range<usize>,
118}
119
120#[derive(Debug, Clone, PartialEq)]
122#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
123pub struct NodeId {
124 pub id: String,
125 pub port: Option<Port>,
126 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
127 pub span: Range<usize>,
128}
129
130#[derive(Debug, Clone, PartialEq)]
132#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
133pub struct Port {
134 pub id: Option<String>,
135 pub compass: Option<Compass>,
136 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
137 pub span: Range<usize>,
138}
139
140#[derive(Debug, Clone, PartialEq)]
142#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
143pub enum Compass {
144 N,
145 NE,
146 E,
147 SE,
148 S,
149 SW,
150 W,
151 NW,
152 C,
153}
154
155#[derive(Debug, Clone, PartialEq)]
157#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
158pub struct Attribute {
159 pub name: String,
160 pub value: Option<String>,
161 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
162 pub span: Range<usize>,
163}