git.delta.rocks / jrsonnet / refs/commits / 0ed995fd3f77

difftreelog

feat(parser) more serialization options

Лач2020-06-27parent: #811ff8a.patch.diff
in: master

3 files changed

modifiedcrates/jsonnet-parser/Cargo.tomldiffbeforeafterboth
--- a/crates/jsonnet-parser/Cargo.toml
+++ b/crates/jsonnet-parser/Cargo.toml
@@ -6,16 +6,18 @@
 
 [features]
 default = []
-# Trace peg token parsing
-# trace = ["peg/trace"]
-# TODO:
-# serialize = ["serde"]
+serialize = ["serde"]
+deserialize = ["serde"]
+# Adds ability to dump AST as source code for easy embedding
+dump = ["structdump", "structdump-derive"]
 
 [dependencies]
 peg = "0.6.2"
-serde = { version = "1.0.114", features = ["derive", "rc"] }
 unescape = "0.1.0"
 
+serde = { version = "1.0.114", features = ["derive", "rc"], optional = true }
+structdump = { version = "0.1.2", optional = true }
+structdump-derive = { version = "0.1.2", optional = true }
+
 [dev-dependencies]
 jsonnet-stdlib = { version = "0.1.0", path = "../jsonnet-stdlib" }
-bincode = "1.3.1"
modifiedcrates/jsonnet-parser/src/expr.rsdiffbeforeafterboth
1use 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;
38
4#[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}
1119
12#[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}
2132
22#[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>);
2438
25#[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}
3350
34#[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}
4060
41#[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}
4871
49#[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}
7298
73/// name, default value99/// name, default value
100#[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>);
105
76/// Defined function parameters106/// Defined function parameters
107#[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}
85118
86#[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);
124
88#[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}
96136
97#[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}
103146
104#[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);
152
106#[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);
108158
109#[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}
114167
115#[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}
123179
124#[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}
129188
130#[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}
139201
140#[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}
146208
147/// Syntax base209/// Syntax base
210#[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),
151216
209}274}
210275
211/// file, begin offset, end offset276/// file, begin offset, end offset
277#[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}
219287
220/// Holds AST expression and its location in source file+288/// Holds AST expression and its location in source file
289#[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 {
modifiedcrates/jsonnet-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jsonnet-parser/src/lib.rs
+++ b/crates/jsonnet-parser/src/lib.rs
@@ -575,11 +575,4 @@
 	fn bench_parse_peg(b: &mut Bencher) {
 		b.iter(|| parse!(jsonnet_stdlib::STDLIB_STR))
 	}
-
-	// From serialized blob
-	#[bench]
-	fn bench_parse_serde_bincode(b: &mut Bencher) {
-		let serialized = bincode::serialize(&parse!(jsonnet_stdlib::STDLIB_STR)).unwrap();
-		b.iter(|| bincode::deserialize::<LocExpr>(&serialized))
-	}
 }