use super::expr::Expr;
use super::span::Span;
use crate::value::AttributePathSegment;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Arg {
Expr(Expr),
Named { name: String, value: Expr },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntoTarget {
pub name: String,
pub path: Vec<AttributePathSegment>,
pub span: Span,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Stmt {
Command {
name: String,
args: Vec<Arg>,
into: Option<IntoTarget>,
span: Span,
},
Assignment {
target_name: String,
target_path: Vec<AttributePathSegment>,
value: Expr,
is_set: bool,
is_var: bool,
is_const: bool,
fallback: Option<Expr>,
span: Span,
},
IfBlock {
condition: Expr,
then_branch: Vec<Stmt>,
elseif_branches: Vec<ElseIfBranch>,
else_branch: Option<Vec<Stmt>>,
span: Span,
},
InlineIf {
condition: Expr,
command: Box<Stmt>,
else_command: Option<Box<Stmt>>,
span: Span,
},
IfTrue {
command: Box<Stmt>,
span: Span,
},
IfFalse {
command: Box<Stmt>,
span: Span,
},
ForLoop {
var_name: String,
iterable: Option<Expr>,
from: Option<Expr>,
to: Option<Expr>,
step: Option<Expr>,
key_var_name: Option<String>,
body: Vec<Stmt>,
span: Span,
},
Define {
name: String,
param_names: Vec<String>,
body: Vec<Stmt>,
span: Span,
},
ScopeBlock {
param_names: Vec<String>,
body: Vec<Stmt>,
into: Option<IntoTarget>,
span: Span,
},
RepeatBlock {
count: Expr,
body: Vec<Stmt>,
into: Option<IntoTarget>,
span: Span,
},
TogetherBlock {
blocks: Vec<Stmt>, span: Span,
},
OnBlock {
event_name: String,
body: Vec<Stmt>,
span: Span,
},
Return {
value: Option<Expr>,
span: Span,
},
Break {
span: Span,
},
Continue {
span: Span,
},
Comment {
text: String,
span: Span,
},
ChunkMarker {
id: String,
span: Span,
},
CellBlock {
cell_type: String,
content: Vec<Stmt>,
raw_text: Option<String>,
span: Span,
},
PromptBlock {
text: String,
span: Span,
},
UseModule {
module_name: String,
span: Span,
},
Decorator {
name: String,
args: Vec<Arg>,
span: Span,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ElseIfBranch {
pub condition: Expr,
pub body: Vec<Stmt>,
pub span: Span,
}
impl Stmt {
pub fn span(&self) -> &Span {
match self {
Stmt::Command { span, .. }
| Stmt::Assignment { span, .. }
| Stmt::IfBlock { span, .. }
| Stmt::InlineIf { span, .. }
| Stmt::IfTrue { span, .. }
| Stmt::IfFalse { span, .. }
| Stmt::ForLoop { span, .. }
| Stmt::Define { span, .. }
| Stmt::ScopeBlock { span, .. }
| Stmt::RepeatBlock { span, .. }
| Stmt::TogetherBlock { span, .. }
| Stmt::OnBlock { span, .. }
| Stmt::Return { span, .. }
| Stmt::Break { span }
| Stmt::Continue { span }
| Stmt::Comment { span, .. }
| Stmt::ChunkMarker { span, .. }
| Stmt::CellBlock { span, .. }
| Stmt::PromptBlock { span, .. }
| Stmt::UseModule { span, .. }
| Stmt::Decorator { span, .. } => span,
}
}
}