git.delta.rocks / jrsonnet / refs/commits / ad8b59dcdf89

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, 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}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.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}154155/// Syntax base156#[derive(Debug, Clone, PartialEq)]157pub enum Expr {158	Literal(LiteralType),159160	/// String value: "hello"161	Str(String),162	/// Number: 1, 2.0, 2e+20163	Num(f64),164	/// Variable name: test165	Var(String),166167	/// Array of expressions: [1, 2, "Hello"]168	Arr(Vec<Expr>),169	/// Array comprehension:170	/// ```jsonnet171	///  ingredients: [172	///    { kind: kind, qty: 4 / 3 }173	///    for kind in [174	///      'Honey Syrup',175	///      'Lemon Juice',176	///      'Farmers Gin',177	///    ]178	///  ],179	/// ```180	ArrComp(Box<Expr>, ForSpecData, Vec<CompSpec>),181182	/// Object: {a: 2}183	Obj(ObjBody),184	/// Object extension: var1 {b: 2}185	ObjExtend(Box<Expr>, ObjBody),186187	/// (obj)188	Parened(Box<Expr>),189190	/// Params in function definition191	/// hello, world, test = 2192	Params(ParamsDesc),193	/// Args in function call194	/// 2 + 2, 3, named = 6195	Args(ArgsDesc),196197	/// -2198	UnaryOp(UnaryOpType, Box<Expr>),199	/// 2 - 2200	BinaryOp(Box<Expr>, BinaryOpType, Box<Expr>),201	/// assert 2 == 2 : "Math is broken"202	AssertExpr(AssertStmt, Box<Expr>),203	/// local a = 2; { b: a }204	LocalExpr(Vec<BindSpec>, Box<Expr>),205206	/// a = 3207	Bind(BindSpec),208	/// import "hello"209	Import(String),210	/// importStr "file.txt"211	ImportStr(String),212	/// error "I'm broken"213	Error(Box<Expr>),214	/// a(b, c)215	Apply(Box<Expr>, ArgsDesc),216	///217	Select(Box<Expr>, String),218	/// a[b]219	Index(Box<Expr>, Box<Expr>),220	/// a[1::2]221	Slice(Box<Expr>, SliceDesc),222	/// function(x) x223	Function(ParamsDesc, Box<Expr>),224	/// if true == false then 1 else 2225	IfElse {226		cond: IfSpecData,227		cond_then: Box<Expr>,228		cond_else: Option<Box<Expr>>,229	},230	/// if 2 = 3231	IfSpec(IfSpecData),232	/// for elem in array233	ForSpec(ForSpecData),234}