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
66
7[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 embedding
12# serialize = ["serde"]12dump = ["structdump", "structdump-derive"]
1313
14[dependencies]14[dependencies]
15peg = "0.6.2"15peg = "0.6.2"
16unescape = "0.1.0"
17
16serde = { 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 }
1821
19[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"
2224
modifiedcrates/jsonnet-parser/src/expr.rsdiffbeforeafterboth
--- a/crates/jsonnet-parser/src/expr.rs
+++ b/crates/jsonnet-parser/src/expr.rs
@@ -1,7 +1,15 @@
-use serde::{Deserialize, Serialize};
 use std::{fmt::Debug, ops::Deref, path::PathBuf, rc::Rc};
+#[cfg(feature = "dump")]
+use structdump_derive::Codegen;
+#[cfg(feature = "serialize")]
+use serde::Serialize;
+#[cfg(feature = "deserialize")]
+use serde::Deserialize;
 
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub enum FieldName {
 	/// {fixed: 2}
 	Fixed(Rc<str>),
@@ -9,7 +17,10 @@
 	Dyn(LocExpr),
 }
 
-#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, Clone, Copy, PartialEq)]
 pub enum Visibility {
 	/// :
 	Normal,
@@ -19,10 +30,16 @@
 	Unhide,
 }
 
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub struct AssertStmt(pub LocExpr, pub Option<LocExpr>);
 
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub struct FieldMember {
 	pub name: FieldName,
 	pub plus: bool,
@@ -31,14 +48,20 @@
 	pub value: LocExpr,
 }
 
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub enum Member {
 	Field(FieldMember),
 	BindStmt(BindSpec),
 	AssertStmt(AssertStmt),
 }
 
-#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, Clone, Copy, PartialEq)]
 pub enum UnaryOpType {
 	Plus,
 	Minus,
@@ -46,7 +69,10 @@
 	Not,
 }
 
-#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, Clone, Copy, PartialEq)]
 pub enum BinaryOpType {
 	Mul,
 	Div,
@@ -71,10 +97,17 @@
 }
 
 /// name, default value
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub struct Param(pub Rc<str>, pub Option<LocExpr>);
+
 /// Defined function parameters
-#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, Clone, PartialEq)]
 pub struct ParamsDesc(pub Rc<Vec<Param>>);
 impl Deref for ParamsDesc {
 	type Target = Vec<Param>;
@@ -83,9 +116,16 @@
 	}
 }
 
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub struct Arg(pub Option<String>, pub LocExpr);
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub struct ArgsDesc(pub Vec<Arg>);
 impl Deref for ArgsDesc {
 	type Target = Vec<Arg>;
@@ -94,25 +134,41 @@
 	}
 }
 
-#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, Clone, PartialEq)]
 pub struct BindSpec {
 	pub name: Rc<str>,
 	pub params: Option<ParamsDesc>,
 	pub value: LocExpr,
 }
 
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub struct IfSpecData(pub LocExpr);
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub struct ForSpecData(pub Rc<str>, pub LocExpr);
 
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub enum CompSpec {
 	IfSpec(IfSpecData),
 	ForSpec(ForSpecData),
 }
 
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub struct ObjComp {
 	pub pre_locals: Vec<BindSpec>,
 	pub key: LocExpr,
@@ -121,13 +177,19 @@
 	pub compspecs: Vec<CompSpec>,
 }
 
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub enum ObjBody {
 	MemberList(Vec<Member>),
 	ObjComp(ObjComp),
 }
 
-#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Copy)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq, Clone, Copy)]
 pub enum LiteralType {
 	This,
 	Super,
@@ -137,7 +199,7 @@
 	False,
 }
 
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[derive(Debug, PartialEq)]
 pub struct SliceDesc {
 	pub start: Option<LocExpr>,
 	pub end: Option<LocExpr>,
@@ -145,7 +207,10 @@
 }
 
 /// Syntax base
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Debug, PartialEq)]
 pub enum Expr {
 	Literal(LiteralType),
 
@@ -209,7 +274,10 @@
 }
 
 /// file, begin offset, end offset
-#[derive(Clone, PartialEq, Serialize, Deserialize)]
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Clone, PartialEq)]
 pub struct ExprLocation(pub Rc<PathBuf>, pub usize, pub usize);
 impl Debug for ExprLocation {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
@@ -217,8 +285,11 @@
 	}
 }
 
-/// Holds AST expression and its location in source file+
-#[derive(Clone, PartialEq, Serialize, Deserialize)]
+/// Holds AST expression and its location in source file
+#[cfg_attr(feature = "dump", derive(Codegen))]
+#[cfg_attr(feature = "serialize", derive(Serialize))]
+#[cfg_attr(feature = "deserialize", derive(Deserialize))]
+#[derive(Clone, PartialEq)]
 pub struct LocExpr(pub Rc<Expr>, pub Option<ExprLocation>);
 impl Debug for LocExpr {
 	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))
-	}
 }