From 0424d165836fcbf15aa2e05527d0e790941c9518 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sun, 24 Mar 2019 23:36:15 +0100 Subject: Lay groundwork for DhallType deriving --- dhall/src/lib.rs | 1 - dhall/tests/dhall_type.rs | 15 +++++++++++++++ dhall_core/src/dhall_type.rs | 10 ++++++++++ dhall_core/src/lib.rs | 2 ++ dhall_generator/src/dhall_expr.rs | 3 +++ dhall_generator/src/dhall_type.rs | 15 +++++++++++++++ dhall_generator/src/lib.rs | 9 ++++++++- 7 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 dhall/tests/dhall_type.rs create mode 100644 dhall_core/src/dhall_type.rs create mode 100644 dhall_generator/src/dhall_type.rs diff --git a/dhall/src/lib.rs b/dhall/src/lib.rs index 3e76395..d9f9edb 100644 --- a/dhall/src/lib.rs +++ b/dhall/src/lib.rs @@ -10,7 +10,6 @@ mod normalize; pub use crate::normalize::*; pub mod binary; -// pub mod dhall_type; pub mod imports; pub mod typecheck; diff --git a/dhall/tests/dhall_type.rs b/dhall/tests/dhall_type.rs new file mode 100644 index 0000000..cbb71a4 --- /dev/null +++ b/dhall/tests/dhall_type.rs @@ -0,0 +1,15 @@ +#![feature(proc_macro_hygiene)] +use dhall_core::*; +use dhall_generator::*; + +#[derive(DhallType)] +struct A { + _field1: bool, + // field2: Option, +} + +#[test] +fn test_dhall_type_a() { + assert_eq!(A::dhall_type(), dhall_expr!(False)); + // assert_eq!(A::dhall_type(), dhall_expr!({ field1: Bool })); +} diff --git a/dhall_core/src/dhall_type.rs b/dhall_core/src/dhall_type.rs new file mode 100644 index 0000000..3635e67 --- /dev/null +++ b/dhall_core/src/dhall_type.rs @@ -0,0 +1,10 @@ +use crate::*; + +#[derive(Debug, Clone)] +pub enum DhallConversionError {} + +pub trait DhallType: Sized { + fn dhall_type() -> DhallExpr; + // fn as_dhall(&self) -> DhallExpr; + // fn from_dhall(e: DhallExpr) -> Result; +} diff --git a/dhall_core/src/lib.rs b/dhall_core/src/lib.rs index 0874b09..b15c644 100644 --- a/dhall_core/src/lib.rs +++ b/dhall_core/src/lib.rs @@ -18,4 +18,6 @@ mod printer; pub use crate::printer::*; mod parser; pub use crate::parser::*; +mod dhall_type; +pub use dhall_type::*; pub mod context; diff --git a/dhall_generator/src/dhall_expr.rs b/dhall_generator/src/dhall_expr.rs index 1eb4580..1ee4d1a 100644 --- a/dhall_generator/src/dhall_expr.rs +++ b/dhall_generator/src/dhall_expr.rs @@ -62,6 +62,9 @@ fn dhall_to_tokenstream( NaturalLit(n) => { quote! { dhall_core::Expr::NaturalLit(#n) } } + BoolLit(b) => { + quote! { dhall_core::Expr::BoolLit(#b) } + } EmptyOptionalLit(x) => { let x = dhall_to_tokenstream_bx(x, ctx); quote! { dhall_core::Expr::EmptyOptionalLit(#x) } diff --git a/dhall_generator/src/dhall_type.rs b/dhall_generator/src/dhall_type.rs new file mode 100644 index 0000000..7cfd945 --- /dev/null +++ b/dhall_generator/src/dhall_type.rs @@ -0,0 +1,15 @@ +extern crate proc_macro; +// use dhall_core::*; +// use proc_macro2::TokenStream; +use quote::quote; + +pub fn derive_dhall_type(_input: proc_macro::TokenStream) -> proc_macro::TokenStream { + (quote!{ + impl DhallType for A { + fn dhall_type() -> dhall_core::DhallExpr { + dhall_core::rc(dhall_core::Expr::BoolLit(false)) + } + } + }).into() +} + diff --git a/dhall_generator/src/lib.rs b/dhall_generator/src/lib.rs index 7d3304b..b52c454 100644 --- a/dhall_generator/src/lib.rs +++ b/dhall_generator/src/lib.rs @@ -1,9 +1,16 @@ extern crate proc_macro; mod dhall_expr; +mod dhall_type; + +use proc_macro::TokenStream; #[proc_macro] -pub fn dhall_expr(input: proc_macro::TokenStream) -> proc_macro::TokenStream { +pub fn dhall_expr(input: TokenStream) -> TokenStream { dhall_expr::dhall_expr(input) } +#[proc_macro_derive(DhallType)] +pub fn derive_dhall_type(input: TokenStream) -> TokenStream { + dhall_type::derive_dhall_type(input) +} -- cgit v1.2.3