rustql_common/ast/
common.rs

1use std::borrow::Cow;
2use serde_derive::{Deserialize, Serialize};
3use crate::position::Span;
4use crate::ast::query::*;
5use crate::ast::schema::*;
6// use crate::position::Position;
7
8/* ========== Common AST Type  ========== */
9#[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    // type system defination
142    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    // type extension defination
151    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    /* TODO */
159    // operation defination
160    SelectSet(SelectSet<'a>),
161    Query(Query<'a>),
162    Mutation(Mutation<'a>),
163    Subscription(Subscription<'a>),
164    // fragment defination
165    FragmentDefination(FragmentDefination<'a>),
166}