1use std::fmt::Display;23#[derive(Debug, Clone, PartialEq)]4pub enum FieldName {5 6 Fixed(String),7 8 Dyn(Box<Expr>),9}1011#[derive(Debug, Clone, PartialEq)]12pub enum Visibility {13 14 Normal,15 16 Hidden,17 18 Unhide,19}2021#[derive(Debug, Clone, PartialEq)]22pub struct AssertStmt(pub Box<Expr>, pub Option<Box<Expr>>);2324#[derive(Debug, Clone, PartialEq)]25pub struct FieldMember {26 pub name: FieldName,27 pub plus: bool,28 pub params: Option<ParamsDesc>,29 pub visibility: Visibility,30 pub value: Expr,31}3233#[derive(Debug, Clone, PartialEq)]34pub enum Member {35 Field(FieldMember),36 BindStmt(BindSpec),37 AssertStmt(AssertStmt),38}3940#[derive(Debug, Clone, Copy, PartialEq)]41pub enum UnaryOpType {42 Plus,43 Minus,44 BitNot,45 Not,46}4748#[derive(Debug, Clone, Copy, PartialEq)]49pub enum BinaryOpType {50 Mul,51 Div,52 Mod,5354 Add,55 Sub,5657 Lhs,58 Rhs,5960 Lt,61 Gt,62 Lte,63 Gte,6465 In,6667 Eq,68 Ne,6970 BitAnd,71 BitOr,72 BitXor,7374 And,75 Or,76}777879#[derive(Debug, Clone, PartialEq)]80pub struct Param(pub String, pub Option<Box<Expr>>);8182#[derive(Debug, Clone, PartialEq)]83pub struct ParamsDesc(pub Vec<Param>);84impl ParamsDesc {85 pub fn with_defaults(&self) -> Vec<Param> {86 self.0.iter().filter(|e| e.1.is_some()).cloned().collect()87 }88}8990#[derive(Debug, Clone, PartialEq)]91pub struct Arg(pub Option<String>, pub Box<Expr>);92#[derive(Debug, Clone, PartialEq)]93pub struct ArgsDesc(pub Vec<Arg>);9495#[derive(Debug, Clone, PartialEq)]96pub struct BindSpec {97 pub name: String,98 pub params: Option<ParamsDesc>,99 pub value: Box<Expr>,100}101102#[derive(Debug, Clone, PartialEq)]103pub struct IfSpecData(pub Box<Expr>);104#[derive(Debug, Clone, PartialEq)]105pub struct ForSpecData(pub String, pub Box<Expr>);106107#[derive(Debug, Clone, PartialEq)]108pub enum CompSpec {109 IfSpec(IfSpecData),110 ForSpec(ForSpecData),111}112113#[derive(Debug, Clone, PartialEq)]114pub enum ObjBody {115 MemberList(Vec<Member>),116 ObjComp {117 pre_locals: Vec<BindSpec>,118 key: Box<Expr>,119 value: Box<Expr>,120 post_locals: Vec<BindSpec>,121 first: ForSpecData,122 rest: Vec<CompSpec>,123 },124}125126#[derive(Debug, Clone, PartialEq)]127pub enum LiteralType {128 This,129 Super,130 Dollar,131 Null,132 True,133 False,134}135impl Display for LiteralType {136 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {137 use LiteralType::*;138 match self {139 This => write!(f, "this"),140 Null => write!(f, "null"),141 True => write!(f, "true"),142 False => write!(f, "false"),143 _ => panic!("non printable item"),144 }145 }146}147148#[derive(Debug, Clone, PartialEq)]149pub struct SliceDesc {150 pub start: Option<Box<Expr>>,151 pub end: Option<Box<Expr>>,152 pub step: Option<Box<Expr>>,153}154155156#[derive(Debug, Clone, PartialEq)]157pub enum Expr {158 Literal(LiteralType),159160 161 Str(String),162 163 Num(f64),164 165 Var(String),166167 168 Arr(Vec<Expr>),169 170 171 172 173 174 175 176 177 178 179 180 ArrComp(Box<Expr>, ForSpecData, Vec<CompSpec>),181182 183 Obj(ObjBody),184 185 ObjExtend(Box<Expr>, ObjBody),186187 188 Parened(Box<Expr>),189190 191 192 Params(ParamsDesc),193 194 195 Args(ArgsDesc),196197 198 UnaryOp(UnaryOpType, Box<Expr>),199 200 BinaryOp(Box<Expr>, BinaryOpType, Box<Expr>),201 202 AssertExpr(AssertStmt, Box<Expr>),203 204 LocalExpr(Vec<BindSpec>, Box<Expr>),205206 207 Bind(BindSpec),208 209 Import(String),210 211 ImportStr(String),212 213 Error(Box<Expr>),214 215 Apply(Box<Expr>, ArgsDesc),216 217 Select(Box<Expr>, String),218 219 Index(Box<Expr>, Box<Expr>),220 221 Slice(Box<Expr>, SliceDesc),222 223 Function(ParamsDesc, Box<Expr>),224 225 IfElse {226 cond: IfSpecData,227 cond_then: Box<Expr>,228 cond_else: Option<Box<Expr>>,229 },230 231 IfSpec(IfSpecData),232 233 ForSpec(ForSpecData),234}