1use serde::{Deserialize, Serialize};
5
6use crate::model::Language;
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub struct FileFacts {
10 pub repo: String,
11 pub path: String,
12 pub language: Language,
13 pub file_id: String,
15 pub modules: Vec<String>,
17 pub imports: Vec<Import>,
18 pub refs: Vec<Ref>,
19 pub types: Vec<TypeHint>,
20 #[serde(default)]
22 pub scip: Option<ScipFacts>,
23 #[serde(default)]
25 pub contracts: Vec<ContractFact>,
26 #[serde(default)]
28 pub values: Vec<ValueFact>,
29 #[serde(default)]
31 pub params: Vec<ParamFact>,
32 #[serde(default)]
34 pub calls: Vec<CallFact>,
35}
36
37#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
40pub struct InfraRef {
41 pub scheme: String,
42 pub name: String,
43 pub logical: bool,
44}
45
46#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
47pub struct ParamFact {
48 pub func: String,
49 pub names: Vec<String>,
50}
51
52#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
53pub struct CallFact {
54 pub from: String,
55 pub callee: Vec<String>,
56 pub args: Args,
57 pub line: u32,
58}
59
60#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
62pub enum ValueExpr {
63 Lit(String),
64 Template(Vec<TemplatePart>),
66 Name(Vec<String>),
68 Env(String),
70 Join {
72 sep: String,
73 parts: Vec<ValueExpr>,
74 },
75 Call {
77 func: Vec<String>,
78 args: Vec<ValueExpr>,
79 kwargs: Vec<(String, ValueExpr)>,
80 },
81 Record(Vec<(String, ValueExpr)>),
83}
84
85#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
86pub enum TemplatePart {
87 Lit(String),
88 Expr(Option<Vec<String>>),
89}
90
91#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
92pub struct ValueFact {
93 pub scope: String,
95 pub name: String,
96 pub value: ValueExpr,
97}
98
99#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
101pub struct Args {
102 pub positional: Vec<Option<ValueExpr>>,
103 pub keywords: Vec<(String, ValueExpr)>,
104 pub calls: Vec<(usize, Vec<String>)>,
106}
107
108impl Args {
109 pub fn get(&self, keyword: &str, position: usize) -> Option<&ValueExpr> {
110 self.keywords
111 .iter()
112 .find(|(k, _)| k == keyword)
113 .map(|(_, v)| v)
114 .or_else(|| self.positional.get(position).and_then(Option::as_ref))
115 }
116}
117
118#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
119pub enum ContractFact {
120 Route {
122 handler: String,
123 receiver: Vec<String>,
124 method: String,
125 path: ValueExpr,
126 line: u32,
127 #[serde(default)]
129 client: bool,
130 },
131 Handle {
134 from: String,
135 #[serde(default)]
137 receiver: Vec<String>,
138 method: String,
139 path: ValueExpr,
140 handler: Vec<String>,
141 line: u32,
142 },
143 Construct {
145 scope: String,
146 target: String,
147 ctor: Vec<String>,
148 args: Args,
149 },
150 Op {
152 from: String,
153 receiver: Vec<String>,
154 method: String,
155 args: Args,
156 line: u32,
157 },
158 Infra {
160 declares: InfraRef,
161 #[serde(default)]
163 subscribes: Option<InfraRef>,
164 },
165 Table { class: String, name: String },
167}
168
169#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
170pub struct ScipFacts {
171 pub defs: Vec<(String, String)>,
173 pub refs: Vec<ScipRef>,
174}
175
176#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
177pub struct ScipRef {
178 pub line: u32,
179 pub name: String,
180 pub symbol: String,
181}
182
183#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
184pub struct Import {
185 pub module: String,
187 pub level: u32,
189 pub items: Vec<ImportItem>,
190 pub line: u32,
191 #[serde(default)]
193 pub file: Option<String>,
194}
195
196#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
197pub enum ImportItem {
198 Name { name: String, alias: Option<String> },
200 Module { alias: Option<String> },
202 All,
204}
205
206#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
207pub struct Ref {
208 pub kind: RefKind,
209 pub from: String,
211 pub path: Vec<String>,
213 pub line: u32,
214}
215
216#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
217pub enum RefKind {
218 Call,
219 New,
220 Inherits,
221 Implements,
222}
223
224#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
226pub struct TypeHint {
227 pub scope: String,
228 pub name: String,
229 pub source: TypeSource,
230}
231
232#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
233pub enum TypeSource {
234 Annotation(Vec<String>),
236 Construct(Vec<String>),
238 Alias { name: String, scope: String },
240}