@@ -4,16 +4,19 @@ use combine::easy::{Error, Info};
44use combine:: { choice, many, many1, optional, position, StdParseResult } ;
55use combine:: { parser, Parser } ;
66#[ cfg( feature = "serde" ) ]
7- use serde:: Serialize ;
7+ use serde:: { Deserialize , Serialize } ;
88
99use crate :: helpers:: { ident, kind, name, punct} ;
1010use crate :: position:: Pos ;
1111use crate :: tokenizer:: { Kind as T , Token , TokenStream } ;
1212
13+ #[ cfg( feature = "serde" ) ]
1314/// Text abstracts over types that hold a string value.
1415/// It is used to make the AST generic over the string type.
15- pub trait Text < ' a > : ' a {
16- #[ cfg( feature = "serde" ) ]
16+ pub trait Text < ' a >
17+ where
18+ Self : ' a + Serialize + Deserialize < ' a > ,
19+ {
1720 type Value : ' a
1821 + From < & ' a str >
1922 + AsRef < str >
@@ -24,9 +27,14 @@ pub trait Text<'a>: 'a {
2427 + Ord
2528 + fmt:: Debug
2629 + Clone
27- + Serialize ;
30+ + Serialize
31+ + Deserialize < ' a > ;
32+ }
2833
29- #[ cfg( not( feature = "serde" ) ) ]
34+ #[ cfg( not( feature = "serde" ) ) ]
35+ /// Text abstracts over types that hold a string value.
36+ /// It is used to make the AST generic over the string type.
37+ pub trait Text < ' a > : ' a {
3038 type Value : ' a
3139 + From < & ' a str >
3240 + AsRef < str >
@@ -52,7 +60,7 @@ impl<'a> Text<'a> for std::borrow::Cow<'a, str> {
5260}
5361
5462#[ derive( Debug , Clone , PartialEq ) ]
55- #[ cfg_attr( feature = "serde" , derive( Serialize ) ) ]
63+ #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
5664pub struct Directive < ' a , T : Text < ' a > > {
5765 pub position : Pos ,
5866 pub name : T :: Value ,
@@ -66,13 +74,13 @@ pub struct Directive<'a, T: Text<'a>> {
6674/// in `serde_json`: encapsulate value in new-type, allowing type
6775/// to be extended later.
6876#[ derive( Debug , Clone , PartialEq ) ]
69- #[ cfg_attr( feature = "serde" , derive( Serialize ) ) ]
77+ #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
7078// we use i64 as a reference implementation: graphql-js thinks even 32bit
7179// integers is enough. We might consider lift this limit later though
7280pub struct Number ( pub ( crate ) i64 ) ;
7381
7482#[ derive( Debug , Clone , PartialEq ) ]
75- #[ cfg_attr( feature = "serde" , derive( Serialize ) ) ]
83+ #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
7684pub enum Value < ' a , T : Text < ' a > > {
7785 Variable ( T :: Value ) ,
7886 Int ( Number ) ,
@@ -106,7 +114,7 @@ impl<'a, T: Text<'a>> Value<'a, T> {
106114}
107115
108116#[ derive( Debug , Clone , PartialEq ) ]
109- #[ cfg_attr( feature = "serde" , derive( Serialize ) ) ]
117+ #[ cfg_attr( feature = "serde" , derive( Serialize , Deserialize ) ) ]
110118pub enum Type < ' a , T : Text < ' a > > {
111119 NamedType ( T :: Value ) ,
112120 ListType ( Box < Type < ' a , T > > ) ,
0 commit comments