Skip to main content

oak_dot/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6/// DOT 文件的根节点
7#[derive(Debug, Clone, PartialEq)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub struct DotRoot {
10    pub graphs: Vec<Graph>,
11}
12
13/// 图定义
14#[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/// 图类型
26#[derive(Debug, Clone, PartialEq)]
27#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
28pub enum GraphType {
29    Graph,
30    Digraph,
31}
32
33/// 语句
34#[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/// 节点语句
45#[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/// 边语句
55#[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/// 边操作数
66#[derive(Debug, Clone, PartialEq)]
67#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
68pub enum EdgeOperand {
69    Node(NodeId),
70    Subgraph(SubgraphStatement),
71}
72
73/// 边操作符
74#[derive(Debug, Clone, PartialEq)]
75#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
76pub enum EdgeOp {
77    Directed,   // ->
78    Undirected, // --
79}
80
81/// 属性语句
82#[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/// 属性目标
92#[derive(Debug, Clone, PartialEq)]
93#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
94pub enum AttributeTarget {
95    Graph,
96    Node,
97    Edge,
98}
99
100/// 子图语句
101#[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/// 赋值语句
111#[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/// 节点 ID
121#[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/// 端口
131#[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/// 方位
141#[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/// 属性
156#[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}