1use std::borrow::Cow;
2use serde_derive::{Deserialize, Serialize};
3use crate::position::Span;
4use crate::ast::query::*;
5use crate::ast::schema::*;
6#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
10#[serde(tag="type")]
11pub enum Value<'a> {
12 Variable(Variable<'a>),
13 IntValue(IntValue<'a>),
14 FloatValue(FloatValue<'a>),
15 StringValue(StringValue<'a>),
16 BooleanValue(BoolValue<'a>),
17 NullValue(NullValue),
18 ListValue(ListValue<'a>),
19 ObjectValue(ObjectValue<'a>),
20 EnumValue(EnumValue<'a>)
21}
22
23pub fn get_value_span(value: &Value) -> Span {
24 match value {
25 Value::Variable(value) => value.span.clone(),
26 Value::IntValue(value) => value.span.clone(),
27 Value::FloatValue(value) => value.span.clone(),
28 Value::StringValue(value) => value.span.clone(),
29 Value::BooleanValue(value) => value.span.clone(),
30 Value::NullValue(value) => value.span.clone(),
31 Value::ListValue(value) => value.span.clone(),
32 Value::ObjectValue(value) => value.span.clone(),
33 Value::EnumValue(value) => value.span.clone(),
34 }
35}
36#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
37pub struct Variable<'a> {
38 pub value: Cow<'a, str>,
39 pub span: Span
40}
41#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
42pub struct IntValue<'a> {
43 pub value: Cow<'a, str>,
44 pub span: Span,
45}
46#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
47pub struct FloatValue<'a> {
48 pub value: Cow<'a, str>,
49 pub span: Span,
50}
51#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
52pub struct StringValue<'a> {
53 pub value: Cow<'a, str>,
54 pub span: Span,
55}
56#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
57pub struct BoolValue<'a> {
58 pub value: Cow<'a, str>,
59 pub span: Span,
60}
61#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
62pub struct NullValue {
63 pub span: Span,
64}
65#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
66pub struct EnumValue<'a> {
67 pub value: Cow<'a, str>,
68 pub span: Span,
69}
70#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
71pub struct ListValue<'a> {
72 pub value: Vec<Value<'a>>,
73 pub span: Span,
74}
75#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
76pub struct ObjectValue<'a> {
77 pub value: Vec<ObjectField<'a>>,
78 pub span: Span,
79}
80#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
81#[serde(tag="type")]
82pub struct Name<'a> {
83 pub name: Cow<'a, str>,
84 pub span: Span,
85}
86#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
87#[serde(tag="type")]
88pub enum VarType<'a> {
89 NameVarType(NameVarType<'a>),
90 ListVarType(ListVarType<'a>),
91 NonNullVarType(NonNullType<'a>)
92}
93#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
94pub struct NameVarType<'a> {
95 pub name: Cow<'a, str>,
96 pub span: Span,
97}
98#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
99pub struct ListVarType<'a> {
100 pub list_type: Box<VarType<'a>>
101}
102#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
103pub struct NonNullType<'a> {
104 pub nonull_type: Box<VarType<'a>>
105}
106pub fn get_type_span(some_type: &VarType) -> Span {
107 match some_type {
108 VarType::NameVarType(name_type) => name_type.span.clone(),
109 VarType::ListVarType(list_type) => get_type_span(list_type.list_type.as_ref()),
110 VarType::NonNullVarType(nonull_type) => get_type_span(nonull_type.nonull_type.as_ref())
111 }
112}
113#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
114#[serde(tag="type")]
115pub struct Argument<'a> {
116 pub name: Name<'a>,
117 pub value: Value<'a>,
118 pub span: Span,
119}
120#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
121#[serde(tag="type")]
122pub struct ObjectField<'a> {
123 pub name: Name<'a>,
124 pub value: Value<'a>,
125}
126#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
127#[serde(tag="type")]
128pub struct Directive<'a> {
129 pub name: Name<'a>,
130 pub arguments: Option<Vec<Argument<'a>>>,
131 pub span: Span,
132}
133#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
134#[serde(tag="type")]
135pub struct Document<'a> {
136 pub definations: Vec<Defination<'a>>,
137}
138#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
139#[serde(tag="type")]
140pub enum Defination<'a> {
141 SchemaTypeDefination(SchmaTypeDefination<'a>),
143 DirectiveDefination(DirectiveDefinition<'a>),
144 ScalarTypeDefinition(ScalarTypeDefinition<'a>),
145 ObjectTypeDefinition(ObjectTypeDefinition<'a>),
146 InterfaceTypeDefinition(InterfaceTypeDefinition<'a>),
147 UnionTypeDefinition(UnionTypeDefinition<'a>),
148 EnumTypeDefinition(EnumTypeDefinition<'a>),
149 InputObjectTypeDefinition(InputObjectTypeDefinition<'a>),
150 SchemaTypeExtension(SchemaTypeExtension<'a>),
152 ScalarTypeExtension(ScalarTypeExtension<'a>),
153 ObjectTypeExtension(ObjectTypeExtension<'a>),
154 InterfaceTypeExtension(InterfaceTypeExtension<'a>),
155 UnionTypeExtension(UnionTypeExtension<'a>),
156 EnumTypeExtension(EnumTypeExtension<'a>),
157 InputObjectTypeExtension(InputObjectTypeExtension<'a>),
158 SelectSet(SelectSet<'a>),
161 Query(Query<'a>),
162 Mutation(Mutation<'a>),
163 Subscription(Subscription<'a>),
164 FragmentDefination(FragmentDefination<'a>),
166}