From 0ed995fd3f77c13ffab8c179b9570e4bfd4d0b28 Mon Sep 17 00:00:00 2001 From: Лач Date: Sat, 27 Jun 2020 08:22:01 +0000 Subject: [PATCH] feat(parser): more serialization options --- --- 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" --- 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), @@ -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); -#[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, pub Option); + /// 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>); impl Deref for ParamsDesc { type Target = Vec; @@ -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, 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); impl Deref for ArgsDesc { type Target = Vec; @@ -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, pub params: Option, 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, 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, pub key: LocExpr, @@ -121,13 +177,19 @@ pub compspecs: Vec, } -#[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), 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, pub end: Option, @@ -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, 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, pub Option); impl Debug for LocExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { --- 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::(&serialized)) - } } -- gitstuff