use crate::rustlite::Span;
#[derive(Debug, Clone, PartialEq)]
pub struct Facet {
pub name: String,
pub state_vars: Vec<StateVar>,
pub events: Vec<EventDecl>,
pub functions: Vec<Function>,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Ty {
Uint256,
Address,
Bool,
Bytes32,
String,
Bytes,
}
impl Ty {
pub fn is_dynamic(self) -> bool {
matches!(self, Ty::String | Ty::Bytes)
}
}
impl Ty {
pub fn abi_name(self) -> &'static str {
match self {
Ty::Uint256 => "uint256",
Ty::Address => "address",
Ty::Bool => "bool",
Ty::Bytes32 => "bytes32",
Ty::String => "string",
Ty::Bytes => "bytes",
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum StateVarKind {
Scalar(Ty),
Mapping {
key: Ty,
value: Ty,
},
Array {
elem: Ty,
},
DynamicBytes {
is_string: bool,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct StateVar {
pub kind: StateVarKind,
pub name: String,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub struct EventArg {
pub ty: Ty,
pub indexed: bool,
pub name: String,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub struct EventDecl {
pub name: String,
pub args: Vec<EventArg>,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Param {
pub ty: Ty,
pub name: String,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Mutability {
View,
Pure,
NonPayable,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Function {
pub name: String,
pub params: Vec<Param>,
pub mutability: Mutability,
pub returns: Option<Ty>,
pub body: Stmt,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CmpOp {
Gt,
Lt,
Ge,
Le,
Eq,
Neq,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Stmt {
Return(Expr),
Require { cond: Expr, span: Span },
Assign { name: String, value: Expr, span: Span },
IndexAssign { base: String, key: Expr, value: Expr, span: Span },
Push { base: String, value: Expr, span: Span },
Pop { base: String, span: Span },
DeleteIndex { base: String, key: Expr, span: Span },
Emit { name: String, args: Vec<Expr>, span: Span },
Block(Vec<Stmt>),
If { cond: Expr, then_body: Vec<Stmt>, else_body: Vec<Stmt>, span: Span },
}
#[derive(Debug, Clone, PartialEq)]
pub enum Expr {
IntLit { value_be32: [u8; 32], span: Span },
StateVar { name: String, span: Span },
MsgSender { span: Span },
BlockTimestamp { span: Span },
BlockNumber { span: Span },
Index { base: String, key: Box<Expr>, span: Span },
ArrayLen { base: String, span: Span },
Add { lhs: Box<Expr>, rhs: Box<Expr>, span: Span },
Sub { lhs: Box<Expr>, rhs: Box<Expr>, span: Span },
Mul { lhs: Box<Expr>, rhs: Box<Expr>, span: Span },
Div { lhs: Box<Expr>, rhs: Box<Expr>, span: Span },
Mod { lhs: Box<Expr>, rhs: Box<Expr>, span: Span },
Cmp { op: CmpOp, lhs: Box<Expr>, rhs: Box<Expr>, span: Span },
StrLit { value: Vec<u8>, span: Span },
}
impl Expr {
pub fn span(&self) -> Span {
match self {
Expr::IntLit { span, .. } => *span,
Expr::StateVar { span, .. } => *span,
Expr::MsgSender { span, .. } => *span,
Expr::BlockTimestamp { span, .. } => *span,
Expr::BlockNumber { span, .. } => *span,
Expr::Index { span, .. } => *span,
Expr::ArrayLen { span, .. } => *span,
Expr::Add { span, .. } => *span,
Expr::Sub { span, .. } => *span,
Expr::Mul { span, .. } => *span,
Expr::Div { span, .. } => *span,
Expr::Mod { span, .. } => *span,
Expr::Cmp { span, .. } => *span,
Expr::StrLit { span, .. } => *span,
}
}
}