Skip to content

Commit 0a1bb60

Browse files
committed
WIP: Fix Lifetime Issues For Support Serde Deserialization
1 parent 0a1900f commit 0a1bb60

File tree

4 files changed

+22
-16
lines changed

4 files changed

+22
-16
lines changed

src/common.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@ use combine::easy::{Error, Info};
44
use combine::{choice, many, many1, optional, position, StdParseResult};
55
use combine::{parser, Parser};
66
#[cfg(feature = "serde")]
7-
use serde::Serialize;
7+
use serde::{Deserialize, Serialize};
88

99
use crate::helpers::{ident, kind, name, punct};
1010
use crate::position::Pos;
1111
use 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))]
5664
pub 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
7280
pub 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))]
7684
pub 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))]
110118
pub enum Type<'a, T: Text<'a>> {
111119
NamedType(T::Value),
112120
ListType(Box<Type<'a, T>>),

src/position.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#[cfg(feature = "serde")]
2-
use serde::Serialize;
2+
use serde::{Deserialize, Serialize};
33
use std::fmt;
44

55
/// Original position of element in source code
66
#[derive(PartialOrd, Ord, PartialEq, Eq, Clone, Copy, Default, Hash)]
7-
#[cfg_attr(feature = "serde", derive(Serialize))]
7+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
88
pub struct Pos {
99
/// One-based line number
1010
pub line: usize,

src/schema/ast.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use std::str::FromStr;
21
#[cfg(feature = "serde")]
3-
use serde::{Serialize, Deserialize};
2+
use serde::{Deserialize, Serialize};
3+
use std::str::FromStr;
44
use thiserror::Error;
55

66
pub use crate::common::{Directive, Text, Type, Value};

src/schema/format.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
use std::fmt;
2-
31
use crate::common::Text;
42
use crate::format::{format_directives, Displayable, Formatter, Style};
5-
63
use crate::schema::ast::*;
4+
use std::fmt;
75

86
impl<'a, T> Document<'a, T>
97
where

0 commit comments

Comments
 (0)