From fdbf262da6b2bcc093c18aedb93bdc9eb9b03598 Mon Sep 17 00:00:00 2001 From: Matthew Hammer Date: Tue, 12 Jan 2021 10:18:44 -0700 Subject: [PATCH] candid asts as candid data --- rust/candid/src/parser/types.rs | 27 +++++++++++++++++++-------- rust/candid/src/types/internal.rs | 3 ++- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/rust/candid/src/parser/types.rs b/rust/candid/src/parser/types.rs index 8321fd99..491c6d7c 100644 --- a/rust/candid/src/parser/types.rs +++ b/rust/candid/src/parser/types.rs @@ -1,22 +1,33 @@ use crate::types::Label; use crate::Result; use pretty::RcDoc; +use crate::{CandidType, Deserialize}; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize, Eq, PartialEq, Hash)] pub enum IDLType { + #[serde(rename(serialize = "prim", deserialize = "prim"))] PrimT(PrimType), + #[serde(rename(serialize = "var", deserialize = "var"))] VarT(String), + #[serde(rename(serialize = "func", deserialize = "func"))] FuncT(FuncType), + #[serde(rename(serialize = "opt", deserialize = "opt"))] OptT(Box), + #[serde(rename(serialize = "vec", deserialize = "vec"))] VecT(Box), + #[serde(rename(serialize = "record", deserialize = "record"))] RecordT(Vec), + #[serde(rename(serialize = "variant", deserialize = "variant"))] VariantT(Vec), + #[serde(rename(serialize = "service", deserialize = "service"))] ServT(Vec), + #[serde(rename(serialize = "class", deserialize = "class"))] ClassT(Vec, Box), + #[serde(rename(serialize = "principal", deserialize = "principal"))] PrincipalT, } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize, Eq, PartialEq, Hash)] pub struct IDLTypes { pub args: Vec, } @@ -25,7 +36,7 @@ macro_rules! enum_to_doc { (pub enum $name:ident { $($variant:ident),*, }) => { - #[derive(Debug, Clone, PartialEq, Eq, Hash)] + #[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize)] pub enum $name { $($variant),* } @@ -72,7 +83,7 @@ pub enum FuncMode { Query, }} -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize, Eq, PartialEq, Hash)] pub struct FuncType { pub modes: Vec, pub args: Vec, @@ -90,25 +101,25 @@ impl FuncType { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize, Eq, PartialEq, Hash)] pub struct TypeField { pub label: Label, pub typ: IDLType, } -#[derive(Debug)] +#[derive(Debug, Clone, Deserialize, Eq, PartialEq, Hash)] pub enum Dec { TypD(Binding), ImportD(String), } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize, Eq, PartialEq, Hash)] pub struct Binding { pub id: String, pub typ: IDLType, } -#[derive(Debug)] +#[derive(Debug, Clone, Deserialize, Eq, PartialEq, Hash)] pub struct IDLProg { pub decs: Vec, pub actor: Option, diff --git a/rust/candid/src/types/internal.rs b/rust/candid/src/types/internal.rs index f5a39d47..0ab7de19 100644 --- a/rust/candid/src/types/internal.rs +++ b/rust/candid/src/types/internal.rs @@ -4,6 +4,7 @@ use num_enum::TryFromPrimitive; use std::cell::RefCell; use std::collections::HashMap; use std::fmt; +use crate::Deserialize; // This is a re-implementation of std::any::TypeId to get rid of 'static constraint. // The current TypeId doesn't consider lifetime while computing the hash, which is @@ -212,7 +213,7 @@ impl fmt::Display for Type { } } -#[derive(Debug, Eq, Clone)] +#[derive(Debug, Eq, Clone, Deserialize)] pub enum Label { Id(u32), Named(String),