difftreelog
feat(parser) more serialization options
in: master
3 files changed
crates/jsonnet-parser/Cargo.tomldiffbeforeafterboth667[features]7[features]8default = []8default = []9# Trace peg token parsing9serialize = ["serde"]10# trace = ["peg/trace"]10deserialize = ["serde"]11# TODO:11# Adds ability to dump AST as source code for easy embedding12# serialize = ["serde"]12dump = ["structdump", "structdump-derive"]131314[dependencies]14[dependencies]15peg = "0.6.2"15peg = "0.6.2"16unescape = "0.1.0"1716serde = { version = "1.0.114", features = ["derive", "rc"] }18serde = { version = "1.0.114", features = ["derive", "rc"], optional = true }17unescape = "0.1.0"19structdump = { version = "0.1.2", optional = true }20structdump-derive = { version = "0.1.2", optional = true }182119[dev-dependencies]22[dev-dependencies]20jsonnet-stdlib = { version = "0.1.0", path = "../jsonnet-stdlib" }23jsonnet-stdlib = { version = "0.1.0", path = "../jsonnet-stdlib" }21bincode = "1.3.1"2224crates/jsonnet-parser/src/expr.rsdiffbeforeafterboth1use serde::{Deserialize, Serialize};2use std::{fmt::Debug, ops::Deref, path::PathBuf, rc::Rc};1use std::{fmt::Debug, ops::Deref, path::PathBuf, rc::Rc};2#[cfg(feature = "dump")]3use structdump_derive::Codegen;4#[cfg(feature = "serialize")]5use serde::Serialize;6#[cfg(feature = "deserialize")]7use serde::Deserialize;384#[derive(Debug, PartialEq, Serialize, Deserialize)]9#[cfg_attr(feature = "dump", derive(Codegen))]10#[cfg_attr(feature = "serialize", derive(Serialize))]11#[cfg_attr(feature = "deserialize", derive(Deserialize))]12#[derive(Debug, PartialEq)]5pub enum FieldName {13pub enum FieldName {6 /// {fixed: 2}14 /// {fixed: 2}7 Fixed(Rc<str>),15 Fixed(Rc<str>),8 /// {["dyn"+"amic"]: 3}16 /// {["dyn"+"amic"]: 3}9 Dyn(LocExpr),17 Dyn(LocExpr),10}18}111912#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]20#[cfg_attr(feature = "dump", derive(Codegen))]21#[cfg_attr(feature = "serialize", derive(Serialize))]22#[cfg_attr(feature = "deserialize", derive(Deserialize))]23#[derive(Debug, Clone, Copy, PartialEq)]13pub enum Visibility {24pub enum Visibility {14 /// :25 /// :15 Normal,26 Normal,19 Unhide,30 Unhide,20}31}213222#[derive(Debug, PartialEq, Serialize, Deserialize)]33#[cfg_attr(feature = "dump", derive(Codegen))]34#[cfg_attr(feature = "serialize", derive(Serialize))]35#[cfg_attr(feature = "deserialize", derive(Deserialize))]36#[derive(Debug, PartialEq)]23pub struct AssertStmt(pub LocExpr, pub Option<LocExpr>);37pub struct AssertStmt(pub LocExpr, pub Option<LocExpr>);243825#[derive(Debug, PartialEq, Serialize, Deserialize)]39#[cfg_attr(feature = "dump", derive(Codegen))]40#[cfg_attr(feature = "serialize", derive(Serialize))]41#[cfg_attr(feature = "deserialize", derive(Deserialize))]42#[derive(Debug, PartialEq)]26pub struct FieldMember {43pub struct FieldMember {27 pub name: FieldName,44 pub name: FieldName,28 pub plus: bool,45 pub plus: bool,31 pub value: LocExpr,48 pub value: LocExpr,32}49}335034#[derive(Debug, PartialEq, Serialize, Deserialize)]51#[cfg_attr(feature = "dump", derive(Codegen))]52#[cfg_attr(feature = "serialize", derive(Serialize))]53#[cfg_attr(feature = "deserialize", derive(Deserialize))]54#[derive(Debug, PartialEq)]35pub enum Member {55pub enum Member {36 Field(FieldMember),56 Field(FieldMember),37 BindStmt(BindSpec),57 BindStmt(BindSpec),38 AssertStmt(AssertStmt),58 AssertStmt(AssertStmt),39}59}406041#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]61#[cfg_attr(feature = "dump", derive(Codegen))]62#[cfg_attr(feature = "serialize", derive(Serialize))]63#[cfg_attr(feature = "deserialize", derive(Deserialize))]64#[derive(Debug, Clone, Copy, PartialEq)]42pub enum UnaryOpType {65pub enum UnaryOpType {43 Plus,66 Plus,44 Minus,67 Minus,45 BitNot,68 BitNot,46 Not,69 Not,47}70}487149#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]72#[cfg_attr(feature = "dump", derive(Codegen))]73#[cfg_attr(feature = "serialize", derive(Serialize))]74#[cfg_attr(feature = "deserialize", derive(Deserialize))]75#[derive(Debug, Clone, Copy, PartialEq)]50pub enum BinaryOpType {76pub enum BinaryOpType {51 Mul,77 Mul,52 Div,78 Div,71}97}729873/// name, default value99/// name, default value100#[cfg_attr(feature = "dump", derive(Codegen))]101#[cfg_attr(feature = "serialize", derive(Serialize))]102#[cfg_attr(feature = "deserialize", derive(Deserialize))]74#[derive(Debug, PartialEq, Serialize, Deserialize)]103#[derive(Debug, PartialEq)]75pub struct Param(pub Rc<str>, pub Option<LocExpr>);104pub struct Param(pub Rc<str>, pub Option<LocExpr>);10576/// Defined function parameters106/// Defined function parameters107#[cfg_attr(feature = "dump", derive(Codegen))]108#[cfg_attr(feature = "serialize", derive(Serialize))]109#[cfg_attr(feature = "deserialize", derive(Deserialize))]77#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]110#[derive(Debug, Clone, PartialEq)]78pub struct ParamsDesc(pub Rc<Vec<Param>>);111pub struct ParamsDesc(pub Rc<Vec<Param>>);79impl Deref for ParamsDesc {112impl Deref for ParamsDesc {80 type Target = Vec<Param>;113 type Target = Vec<Param>;83 }116 }84}117}8511886#[derive(Debug, PartialEq, Serialize, Deserialize)]119#[cfg_attr(feature = "dump", derive(Codegen))]120#[cfg_attr(feature = "serialize", derive(Serialize))]121#[cfg_attr(feature = "deserialize", derive(Deserialize))]122#[derive(Debug, PartialEq)]87pub struct Arg(pub Option<String>, pub LocExpr);123pub struct Arg(pub Option<String>, pub LocExpr);12488#[derive(Debug, PartialEq, Serialize, Deserialize)]125#[cfg_attr(feature = "dump", derive(Codegen))]126#[cfg_attr(feature = "serialize", derive(Serialize))]127#[cfg_attr(feature = "deserialize", derive(Deserialize))]128#[derive(Debug, PartialEq)]89pub struct ArgsDesc(pub Vec<Arg>);129pub struct ArgsDesc(pub Vec<Arg>);90impl Deref for ArgsDesc {130impl Deref for ArgsDesc {91 type Target = Vec<Arg>;131 type Target = Vec<Arg>;94 }134 }95}135}9613697#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]137#[cfg_attr(feature = "dump", derive(Codegen))]138#[cfg_attr(feature = "serialize", derive(Serialize))]139#[cfg_attr(feature = "deserialize", derive(Deserialize))]140#[derive(Debug, Clone, PartialEq)]98pub struct BindSpec {141pub struct BindSpec {99 pub name: Rc<str>,142 pub name: Rc<str>,100 pub params: Option<ParamsDesc>,143 pub params: Option<ParamsDesc>,101 pub value: LocExpr,144 pub value: LocExpr,102}145}103146104#[derive(Debug, PartialEq, Serialize, Deserialize)]147#[cfg_attr(feature = "dump", derive(Codegen))]148#[cfg_attr(feature = "serialize", derive(Serialize))]149#[cfg_attr(feature = "deserialize", derive(Deserialize))]150#[derive(Debug, PartialEq)]105pub struct IfSpecData(pub LocExpr);151pub struct IfSpecData(pub LocExpr);152106#[derive(Debug, PartialEq, Serialize, Deserialize)]153#[cfg_attr(feature = "dump", derive(Codegen))]154#[cfg_attr(feature = "serialize", derive(Serialize))]155#[cfg_attr(feature = "deserialize", derive(Deserialize))]156#[derive(Debug, PartialEq)]107pub struct ForSpecData(pub Rc<str>, pub LocExpr);157pub struct ForSpecData(pub Rc<str>, pub LocExpr);108158109#[derive(Debug, PartialEq, Serialize, Deserialize)]159#[cfg_attr(feature = "dump", derive(Codegen))]160#[cfg_attr(feature = "serialize", derive(Serialize))]161#[cfg_attr(feature = "deserialize", derive(Deserialize))]162#[derive(Debug, PartialEq)]110pub enum CompSpec {163pub enum CompSpec {111 IfSpec(IfSpecData),164 IfSpec(IfSpecData),112 ForSpec(ForSpecData),165 ForSpec(ForSpecData),113}166}114167115#[derive(Debug, PartialEq, Serialize, Deserialize)]168#[cfg_attr(feature = "dump", derive(Codegen))]169#[cfg_attr(feature = "serialize", derive(Serialize))]170#[cfg_attr(feature = "deserialize", derive(Deserialize))]171#[derive(Debug, PartialEq)]116pub struct ObjComp {172pub struct ObjComp {117 pub pre_locals: Vec<BindSpec>,173 pub pre_locals: Vec<BindSpec>,118 pub key: LocExpr,174 pub key: LocExpr,121 pub compspecs: Vec<CompSpec>,177 pub compspecs: Vec<CompSpec>,122}178}123179124#[derive(Debug, PartialEq, Serialize, Deserialize)]180#[cfg_attr(feature = "dump", derive(Codegen))]181#[cfg_attr(feature = "serialize", derive(Serialize))]182#[cfg_attr(feature = "deserialize", derive(Deserialize))]183#[derive(Debug, PartialEq)]125pub enum ObjBody {184pub enum ObjBody {126 MemberList(Vec<Member>),185 MemberList(Vec<Member>),127 ObjComp(ObjComp),186 ObjComp(ObjComp),128}187}129188130#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Copy)]189#[cfg_attr(feature = "dump", derive(Codegen))]190#[cfg_attr(feature = "serialize", derive(Serialize))]191#[cfg_attr(feature = "deserialize", derive(Deserialize))]192#[derive(Debug, PartialEq, Clone, Copy)]131pub enum LiteralType {193pub enum LiteralType {132 This,194 This,133 Super,195 Super,137 False,199 False,138}200}139201140#[derive(Debug, PartialEq, Serialize, Deserialize)]202#[derive(Debug, PartialEq)]141pub struct SliceDesc {203pub struct SliceDesc {142 pub start: Option<LocExpr>,204 pub start: Option<LocExpr>,143 pub end: Option<LocExpr>,205 pub end: Option<LocExpr>,144 pub step: Option<LocExpr>,206 pub step: Option<LocExpr>,145}207}146208147/// Syntax base209/// Syntax base210#[cfg_attr(feature = "dump", derive(Codegen))]211#[cfg_attr(feature = "serialize", derive(Serialize))]212#[cfg_attr(feature = "deserialize", derive(Deserialize))]148#[derive(Debug, PartialEq, Serialize, Deserialize)]213#[derive(Debug, PartialEq)]149pub enum Expr {214pub enum Expr {150 Literal(LiteralType),215 Literal(LiteralType),151216209}274}210275211/// file, begin offset, end offset276/// file, begin offset, end offset277#[cfg_attr(feature = "dump", derive(Codegen))]278#[cfg_attr(feature = "serialize", derive(Serialize))]279#[cfg_attr(feature = "deserialize", derive(Deserialize))]212#[derive(Clone, PartialEq, Serialize, Deserialize)]280#[derive(Clone, PartialEq)]213pub struct ExprLocation(pub Rc<PathBuf>, pub usize, pub usize);281pub struct ExprLocation(pub Rc<PathBuf>, pub usize, pub usize);214impl Debug for ExprLocation {282impl Debug for ExprLocation {215 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {283 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {216 write!(f, "{:?}:{:?}-{:?}", self.0, self.1, self.2)284 write!(f, "{:?}:{:?}-{:?}", self.0, self.1, self.2)217 }285 }218}286}219287220/// Holds AST expression and its location in source file+288/// Holds AST expression and its location in source file289#[cfg_attr(feature = "dump", derive(Codegen))]290#[cfg_attr(feature = "serialize", derive(Serialize))]291#[cfg_attr(feature = "deserialize", derive(Deserialize))]221#[derive(Clone, PartialEq, Serialize, Deserialize)]292#[derive(Clone, PartialEq)]222pub struct LocExpr(pub Rc<Expr>, pub Option<ExprLocation>);293pub struct LocExpr(pub Rc<Expr>, pub Option<ExprLocation>);223impl Debug for LocExpr {294impl Debug for LocExpr {224 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {295 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {crates/jsonnet-parser/src/lib.rsdiffbeforeafterboth576 b.iter(|| parse!(jsonnet_stdlib::STDLIB_STR))576 b.iter(|| parse!(jsonnet_stdlib::STDLIB_STR))577 }577 }578579 // From serialized blob580 #[bench]581 fn bench_parse_serde_bincode(b: &mut Bencher) {582 let serialized = bincode::serialize(&parse!(jsonnet_stdlib::STDLIB_STR)).unwrap();583 b.iter(|| bincode::deserialize::<LocExpr>(&serialized))584 }585}578}586579