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.087 .iter()88 .filter(|e| e.1.is_some())89 .map(|e| e.clone())90 .collect()91 }92}9394#[derive(Debug, Clone, PartialEq)]95pub struct Arg(pub Option<String>, pub Box<Expr>);96#[derive(Debug, Clone, PartialEq)]97pub struct ArgsDesc(pub Vec<Arg>);9899#[derive(Debug, Clone, PartialEq)]100pub struct BindSpec {101 pub name: String,102 pub params: Option<ParamsDesc>,103 pub value: Box<Expr>,104}105106#[derive(Debug, Clone, PartialEq)]107pub struct IfSpecData(pub Box<Expr>);108#[derive(Debug, Clone, PartialEq)]109pub struct ForSpecData(pub String, pub Box<Expr>);110111#[derive(Debug, Clone, PartialEq)]112pub enum CompSpec {113 IfSpec(IfSpecData),114 ForSpec(ForSpecData),115}116117#[derive(Debug, Clone, PartialEq)]118pub enum ObjBody {119 MemberList(Vec<Member>),120 ObjComp {121 pre_locals: Vec<BindSpec>,122 key: Box<Expr>,123 value: Box<Expr>,124 post_locals: Vec<BindSpec>,125 first: ForSpecData,126 rest: Vec<CompSpec>,127 },128}129130#[derive(Debug, Clone, PartialEq)]131pub enum LiteralType {132 This,133 Super,134 Dollar,135 Null,136 True,137 False,138}139impl Display for LiteralType {140 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {141 use LiteralType::*;142 match self {143 This => write!(f, "this"),144 Null => write!(f, "null"),145 True => write!(f, "true"),146 False => write!(f, "false"),147 _ => panic!("non printable item"),148 }149 }150}151152#[derive(Debug, Clone, PartialEq)]153pub struct SliceDesc {154 pub start: Option<Box<Expr>>,155 pub end: Option<Box<Expr>>,156 pub step: Option<Box<Expr>>,157}158159160#[derive(Debug, Clone, PartialEq)]161pub enum Expr {162 Literal(LiteralType),163164 165 Str(String),166 167 Num(f64),168 169 Var(String),170171 172 Arr(Vec<Expr>),173 174 175 176 177 178 179 180 181 182 183 184 ArrComp(Box<Expr>, ForSpecData, Vec<CompSpec>),185186 187 Obj(ObjBody),188 189 ObjExtend(Box<Expr>, ObjBody),190191 192 Parened(Box<Expr>),193194 195 196 Params(ParamsDesc),197 198 199 Args(ArgsDesc),200201 202 UnaryOp(UnaryOpType, Box<Expr>),203 204 BinaryOp(Box<Expr>, BinaryOpType, Box<Expr>),205 206 AssertExpr(AssertStmt, Box<Expr>),207 208 LocalExpr(Vec<BindSpec>, Box<Expr>),209210 211 Bind(BindSpec),212 213 Import(String),214 215 ImportStr(String),216 217 Error(Box<Expr>),218 219 Apply(Box<Expr>, ArgsDesc),220 221 Select(Box<Expr>, String),222 223 Index(Box<Expr>, Box<Expr>),224 225 Slice(Box<Expr>, SliceDesc),226 227 Function(ParamsDesc, Box<Expr>),228 229 IfElse {230 cond: IfSpecData,231 cond_then: Box<Expr>,232 cond_else: Option<Box<Expr>>,233 },234 235 IfSpec(IfSpecData),236 237 ForSpec(ForSpecData),238}