1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5use std::time::Duration;
6
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub struct SourceLocation {
10 pub line: usize,
11 pub column: usize,
12 pub offset: usize,
13}
14
15#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
17pub struct Span {
18 pub start: SourceLocation,
19 pub end: SourceLocation,
20}
21
22#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
24pub struct Program {
25 pub declarations: Vec<Declaration>,
26 pub span: Span,
27}
28
29#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
31pub enum Declaration {
32 Agent(AgentDefinition),
33 Behavior(BehaviorDefinition),
34 Function(FunctionDefinition),
35 EventHandler(EventHandler),
36 Struct(StructDefinition),
37}
38
39#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
41pub struct AgentDefinition {
42 pub name: String,
43 pub metadata: AgentMetadata,
44 pub resources: Option<ResourceConfig>,
45 pub security: Option<SecurityConfig>,
46 pub policies: Option<PolicyConfig>,
47 pub span: Span,
48}
49
50#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
52pub struct AgentMetadata {
53 pub name: Option<String>,
54 pub version: Option<String>,
55 pub author: Option<String>,
56 pub description: Option<String>,
57}
58
59#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
61pub struct ResourceConfig {
62 pub memory: Option<SizeValue>,
63 pub cpu: Option<DurationValue>,
64 pub network: Option<bool>,
65 pub storage: Option<SizeValue>,
66}
67
68#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
70pub struct SecurityConfig {
71 pub tier: Option<SecurityTier>,
72 pub capabilities: Vec<String>,
73 pub sandbox: Option<SandboxMode>,
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
78pub enum SecurityTier {
79 Tier1,
80 Tier2,
81 Tier3,
82 Tier4,
83}
84
85#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
87pub enum SandboxMode {
88 Strict,
89 Moderate,
90 Permissive,
91}
92
93#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
95pub struct PolicyConfig {
96 pub execution_timeout: Option<DurationValue>,
97 pub retry_count: Option<u32>,
98 pub failure_action: Option<FailureAction>,
99}
100
101#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
103pub enum FailureAction {
104 Terminate,
105 Restart,
106 Escalate,
107 Ignore,
108}
109
110#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
112pub struct BehaviorDefinition {
113 pub name: String,
114 pub input: Option<ParameterList>,
115 pub output: Option<ParameterList>,
116 pub steps: Block,
117 pub span: Span,
118}
119
120#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
122pub struct FunctionDefinition {
123 pub name: String,
124 pub parameters: ParameterList,
125 pub return_type: Option<Type>,
126 pub body: Block,
127 pub span: Span,
128}
129
130#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
132pub struct EventHandler {
133 pub event_name: String,
134 pub parameters: ParameterList,
135 pub body: Block,
136 pub span: Span,
137}
138
139#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
141pub struct StructDefinition {
142 pub name: String,
143 pub fields: Vec<StructField>,
144 pub span: Span,
145}
146
147#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
149pub struct StructField {
150 pub name: String,
151 pub field_type: Type,
152 pub span: Span,
153}
154
155#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
157pub struct ParameterList {
158 pub parameters: Vec<Parameter>,
159}
160
161#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
163pub struct Parameter {
164 pub name: String,
165 pub param_type: Type,
166 pub default_value: Option<Expression>,
167 pub span: Span,
168}
169
170#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
172pub enum Type {
173 String,
174 Number,
175 Boolean,
176 DateTime,
177 Duration,
178 Size,
179 List(Box<Type>),
180 Map(Box<Type>, Box<Type>),
181 Optional(Box<Type>),
182 Custom(String),
183 Any,
184}
185
186#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
188pub struct Block {
189 pub statements: Vec<Statement>,
190 pub span: Span,
191}
192
193#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
195pub enum Statement {
196 Let(LetStatement),
197 If(IfStatement),
198 Match(MatchStatement),
199 For(ForStatement),
200 While(WhileStatement),
201 Try(TryStatement),
202 Return(ReturnStatement),
203 Emit(EmitStatement),
204 Require(RequireStatement),
205 Check(CheckStatement),
206 Expression(Expression),
207}
208
209#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
211pub struct LetStatement {
212 pub name: String,
213 pub var_type: Option<Type>,
214 pub value: Expression,
215 pub span: Span,
216}
217
218#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
220pub struct IfStatement {
221 pub condition: Expression,
222 pub then_block: Block,
223 pub else_ifs: Vec<ElseIf>,
224 pub else_block: Option<Block>,
225 pub span: Span,
226}
227
228#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
230pub struct ElseIf {
231 pub condition: Expression,
232 pub block: Block,
233 pub span: Span,
234}
235
236#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
238pub struct MatchStatement {
239 pub expression: Expression,
240 pub arms: Vec<MatchArm>,
241 pub span: Span,
242}
243
244#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
246pub struct MatchArm {
247 pub pattern: Pattern,
248 pub body: Expression,
249 pub span: Span,
250}
251
252#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
254pub enum Pattern {
255 Literal(Literal),
256 Wildcard,
257 Identifier(String),
258}
259
260#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
262pub struct ForStatement {
263 pub variable: String,
264 pub iterable: Expression,
265 pub body: Block,
266 pub span: Span,
267}
268
269#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
271pub struct WhileStatement {
272 pub condition: Expression,
273 pub body: Block,
274 pub span: Span,
275}
276
277#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
279pub struct TryStatement {
280 pub try_block: Block,
281 pub catch_variable: Option<String>,
282 pub catch_block: Block,
283 pub span: Span,
284}
285
286#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
288pub struct ReturnStatement {
289 pub value: Option<Expression>,
290 pub span: Span,
291}
292
293#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
295pub struct EmitStatement {
296 pub event_name: String,
297 pub data: Option<Expression>,
298 pub span: Span,
299}
300
301#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
303pub struct RequireStatement {
304 pub requirement: RequirementType,
305 pub span: Span,
306}
307
308#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
310pub enum RequirementType {
311 Capability(String),
312 Capabilities(Vec<String>),
313}
314
315#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
317pub struct CheckStatement {
318 pub policy_name: String,
319 pub span: Span,
320}
321
322#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
324pub enum Expression {
325 Literal(Literal),
326 Identifier(Identifier),
327 FieldAccess(FieldAccess),
328 IndexAccess(IndexAccess),
329 FunctionCall(FunctionCall),
330 MethodCall(MethodCall),
331 BinaryOp(BinaryOperation),
332 UnaryOp(UnaryOperation),
333 Assignment(Assignment),
334 List(ListExpression),
335 Map(MapExpression),
336 Invoke(InvokeExpression),
337 Lambda(LambdaExpression),
338 Conditional(ConditionalExpression),
339}
340
341#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
343pub enum Literal {
344 String(String),
345 Number(f64),
346 Integer(i64),
347 Boolean(bool),
348 Null,
349 Duration(DurationValue),
350 Size(SizeValue),
351}
352
353#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
355pub struct DurationValue {
356 pub value: u64,
357 pub unit: DurationUnit,
358}
359
360#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
362pub enum DurationUnit {
363 Seconds,
364 Minutes,
365 Hours,
366 Days,
367 Milliseconds,
368}
369
370#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
372pub struct SizeValue {
373 pub value: u64,
374 pub unit: SizeUnit,
375}
376
377#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
379pub enum SizeUnit {
380 Bytes,
381 KB,
382 MB,
383 GB,
384 TB,
385}
386
387#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
389pub struct Identifier {
390 pub name: String,
391 pub span: Span,
392}
393
394#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
396pub struct FieldAccess {
397 pub object: Box<Expression>,
398 pub field: String,
399 pub span: Span,
400}
401
402#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
404pub struct IndexAccess {
405 pub object: Box<Expression>,
406 pub index: Box<Expression>,
407 pub span: Span,
408}
409
410#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
412pub struct FunctionCall {
413 pub function: String,
414 pub arguments: Vec<Expression>,
415 pub span: Span,
416}
417
418#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
420pub struct MethodCall {
421 pub object: Box<Expression>,
422 pub method: String,
423 pub arguments: Vec<Expression>,
424 pub span: Span,
425}
426
427#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
429pub struct BinaryOperation {
430 pub left: Box<Expression>,
431 pub operator: BinaryOperator,
432 pub right: Box<Expression>,
433 pub span: Span,
434}
435
436#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
438pub enum BinaryOperator {
439 Add,
440 Subtract,
441 Multiply,
442 Divide,
443 Modulo,
444 Equal,
445 NotEqual,
446 LessThan,
447 LessThanOrEqual,
448 GreaterThan,
449 GreaterThanOrEqual,
450 And,
451 Or,
452 BitwiseAnd,
453 BitwiseOr,
454 BitwiseXor,
455 LeftShift,
456 RightShift,
457}
458
459#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
461pub struct UnaryOperation {
462 pub operator: UnaryOperator,
463 pub operand: Box<Expression>,
464 pub span: Span,
465}
466
467#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
469pub enum UnaryOperator {
470 Not,
471 Negate,
472 BitwiseNot,
473}
474
475#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
477pub struct Assignment {
478 pub target: Box<Expression>,
479 pub value: Box<Expression>,
480 pub span: Span,
481}
482
483#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
485pub struct ListExpression {
486 pub elements: Vec<Expression>,
487 pub span: Span,
488}
489
490#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
492pub struct MapExpression {
493 pub entries: Vec<MapEntry>,
494 pub span: Span,
495}
496
497#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
499pub struct MapEntry {
500 pub key: Expression,
501 pub value: Expression,
502 pub span: Span,
503}
504
505#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
507pub struct InvokeExpression {
508 pub behavior: String,
509 pub arguments: HashMap<String, Expression>,
510 pub span: Span,
511}
512
513#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
515pub struct LambdaExpression {
516 pub parameters: Vec<String>,
517 pub body: Box<Expression>,
518 pub span: Span,
519}
520
521#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
523pub struct ConditionalExpression {
524 pub condition: Box<Expression>,
525 pub if_true: Box<Expression>,
526 pub if_false: Box<Expression>,
527 pub span: Span,
528}
529
530impl DurationValue {
531 pub fn to_duration(&self) -> Duration {
533 match self.unit {
534 DurationUnit::Milliseconds => Duration::from_millis(self.value),
535 DurationUnit::Seconds => Duration::from_secs(self.value),
536 DurationUnit::Minutes => Duration::from_secs(self.value * 60),
537 DurationUnit::Hours => Duration::from_secs(self.value * 3600),
538 DurationUnit::Days => Duration::from_secs(self.value * 86400),
539 }
540 }
541}
542
543impl SizeValue {
544 pub fn to_bytes(&self) -> u64 {
546 match self.unit {
547 SizeUnit::Bytes => self.value,
548 SizeUnit::KB => self.value * 1024,
549 SizeUnit::MB => self.value * 1024 * 1024,
550 SizeUnit::GB => self.value * 1024 * 1024 * 1024,
551 SizeUnit::TB => self.value * 1024 * 1024 * 1024 * 1024,
552 }
553 }
554}
555
556pub trait AstVisitor {
558 type Output;
559
560 fn visit_program(&mut self, program: &Program) -> Self::Output;
561 fn visit_declaration(&mut self, declaration: &Declaration) -> Self::Output;
562 fn visit_statement(&mut self, statement: &Statement) -> Self::Output;
563 fn visit_expression(&mut self, expression: &Expression) -> Self::Output;
564}
565
566pub trait AstVisitorMut {
568 fn visit_program_mut(&mut self, program: &mut Program);
569 fn visit_declaration_mut(&mut self, declaration: &mut Declaration);
570 fn visit_statement_mut(&mut self, statement: &mut Statement);
571 fn visit_expression_mut(&mut self, expression: &mut Expression);
572}