git.delta.rocks / jrsonnet / refs/commits / 078724755e3c

difftreelog

source

crates/jsonnet-parser/src/expr.rs4.2 KiBsourcehistory
1use std::fmt::Display;23#[derive(Debug, Clone, PartialEq)]4pub enum FieldName {5	/// {fixed: 2}6	Fixed(String),7	/// {["dyn"+"amic"]: 3}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, 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}7778/// name, default value79#[derive(Debug, Clone, PartialEq)]80pub struct Param(pub String, pub Option<Box<Expr>>);81/// Defined function parameters82#[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}158159/// Syntax base160#[derive(Debug, Clone, PartialEq)]161pub enum Expr {162	Literal(LiteralType),163164	/// String value: "hello"165	Str(String),166	/// Number: 1, 2.0, 2e+20167	Num(f64),168	/// Variable name: test169	Var(String),170171	/// Array of expressions: [1, 2, "Hello"]172	Arr(Vec<Expr>),173	/// Array comprehension:174	/// ```jsonnet175	///  ingredients: [176	///    { kind: kind, qty: 4 / 3 }177	///    for kind in [178	///      'Honey Syrup',179	///      'Lemon Juice',180	///      'Farmers Gin',181	///    ]182	///  ],183	/// ```184	ArrComp(Box<Expr>, ForSpecData, Vec<CompSpec>),185186	/// Object: {a: 2}187	Obj(ObjBody),188	/// Object extension: var1 {b: 2}189	ObjExtend(Box<Expr>, ObjBody),190191	/// (obj)192	Parened(Box<Expr>),193194	/// Params in function definition195	/// hello, world, test = 2196	Params(ParamsDesc),197	/// Args in function call198	/// 2 + 2, 3, named = 6199	Args(ArgsDesc),200201	/// -2202	UnaryOp(UnaryOpType, Box<Expr>),203	/// 2 - 2204	BinaryOp(Box<Expr>, BinaryOpType, Box<Expr>),205	/// assert 2 == 2 : "Math is broken"206	AssertExpr(AssertStmt, Box<Expr>),207	/// local a = 2; { b: a }208	LocalExpr(Vec<BindSpec>, Box<Expr>),209210	/// a = 3211	Bind(BindSpec),212	/// import "hello"213	Import(String),214	/// importStr "file.txt"215	ImportStr(String),216	/// error "I'm broken"217	Error(Box<Expr>),218	/// a(b, c)219	Apply(Box<Expr>, ArgsDesc),220	///221	Select(Box<Expr>, String),222	/// a[b]223	Index(Box<Expr>, Box<Expr>),224	/// a[1::2]225	Slice(Box<Expr>, SliceDesc),226	/// function(x) x227	Function(ParamsDesc, Box<Expr>),228	/// if true == false then 1 else 2229	IfElse {230		cond: IfSpecData,231		cond_then: Box<Expr>,232		cond_else: Option<Box<Expr>>,233	},234	/// if 2 = 3235	IfSpec(IfSpecData),236	/// for elem in array237	ForSpec(ForSpecData),238}