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.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 {
crates/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))
- }
}