use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Document {
pub definitions: Vec<Definition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Definition {
Operation(OperationDefinition),
Fragment(FragmentDefinition),
Schema(SchemaDefinition),
Type(TypeDefinition),
Directive(DirectiveDefinition),
SchemaExtension(SchemaExtension),
TypeExtension(TypeExtension),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct OperationDefinition {
pub operation_type: OperationType,
pub name: Option<String>,
pub variable_definitions: Vec<VariableDefinition>,
pub directives: Vec<Directive>,
pub selection_set: SelectionSet,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum OperationType {
Query,
Mutation,
Subscription,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VariableDefinition {
pub variable: Variable,
pub type_: Type,
pub default_value: Option<Value>,
pub directives: Vec<Directive>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Variable {
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SelectionSet {
pub selections: Vec<Selection>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Selection {
Field(Field),
InlineFragment(InlineFragment),
FragmentSpread(FragmentSpread),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Field {
pub alias: Option<String>,
pub name: String,
pub arguments: Vec<Argument>,
pub directives: Vec<Directive>,
pub selection_set: Option<SelectionSet>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Argument {
pub name: String,
pub value: Value,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FragmentDefinition {
pub name: String,
pub type_condition: String,
pub directives: Vec<Directive>,
pub selection_set: SelectionSet,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FragmentSpread {
pub fragment_name: String,
pub directives: Vec<Directive>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InlineFragment {
pub type_condition: Option<String>,
pub directives: Vec<Directive>,
pub selection_set: SelectionSet,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Value {
Variable(Variable),
IntValue(i64),
FloatValue(f64),
StringValue(String),
BooleanValue(bool),
NullValue,
EnumValue(String),
ListValue(Vec<Value>),
ObjectValue(HashMap<String, Value>),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Type {
NamedType(String),
ListType(Box<Type>),
NonNullType(Box<Type>),
}
impl Type {
pub fn name(&self) -> String {
match self {
Type::NamedType(name) => name.clone(),
Type::ListType(inner) => {
let name = inner.name();
format!("[{name}]")
}
Type::NonNullType(inner) => {
let name = inner.name();
format!("{name}!")
}
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Directive {
pub name: String,
pub arguments: Vec<Argument>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SchemaDefinition {
pub description: Option<String>,
pub directives: Vec<Directive>,
pub root_operation_types: Vec<RootOperationTypeDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RootOperationTypeDefinition {
pub operation_type: OperationType,
pub named_type: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum TypeDefinition {
Scalar(ScalarTypeDefinition),
Object(ObjectTypeDefinition),
Interface(InterfaceTypeDefinition),
Union(UnionTypeDefinition),
Enum(EnumTypeDefinition),
InputObject(InputObjectTypeDefinition),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ScalarTypeDefinition {
pub description: Option<String>,
pub name: String,
pub directives: Vec<Directive>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ObjectTypeDefinition {
pub description: Option<String>,
pub name: String,
pub implements_interfaces: Vec<String>,
pub directives: Vec<Directive>,
pub fields: Vec<FieldDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FieldDefinition {
pub description: Option<String>,
pub name: String,
pub arguments: Vec<InputValueDefinition>,
pub type_: Type,
pub directives: Vec<Directive>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InputValueDefinition {
pub description: Option<String>,
pub name: String,
pub type_: Type,
pub default_value: Option<Value>,
pub directives: Vec<Directive>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InterfaceTypeDefinition {
pub description: Option<String>,
pub name: String,
pub implements_interfaces: Vec<String>,
pub directives: Vec<Directive>,
pub fields: Vec<FieldDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnionTypeDefinition {
pub description: Option<String>,
pub name: String,
pub directives: Vec<Directive>,
pub types: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EnumTypeDefinition {
pub description: Option<String>,
pub name: String,
pub directives: Vec<Directive>,
pub values: Vec<EnumValueDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EnumValueDefinition {
pub description: Option<String>,
pub value: String,
pub directives: Vec<Directive>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InputObjectTypeDefinition {
pub description: Option<String>,
pub name: String,
pub directives: Vec<Directive>,
pub fields: Vec<InputValueDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DirectiveDefinition {
pub description: Option<String>,
pub name: String,
pub arguments: Vec<InputValueDefinition>,
pub repeatable: bool,
pub locations: Vec<DirectiveLocation>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum DirectiveLocation {
Query,
Mutation,
Subscription,
Field,
FragmentDefinition,
FragmentSpread,
InlineFragment,
VariableDefinition,
Schema,
Scalar,
Object,
FieldDefinition,
ArgumentDefinition,
Interface,
Union,
Enum,
EnumValue,
InputObject,
InputFieldDefinition,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SchemaExtension {
pub directives: Vec<Directive>,
pub root_operation_types: Vec<RootOperationTypeDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum TypeExtension {
Scalar(ScalarTypeExtension),
Object(ObjectTypeExtension),
Interface(InterfaceTypeExtension),
Union(UnionTypeExtension),
Enum(EnumTypeExtension),
InputObject(InputObjectTypeExtension),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ScalarTypeExtension {
pub name: String,
pub directives: Vec<Directive>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ObjectTypeExtension {
pub name: String,
pub implements_interfaces: Vec<String>,
pub directives: Vec<Directive>,
pub fields: Vec<FieldDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InterfaceTypeExtension {
pub name: String,
pub implements_interfaces: Vec<String>,
pub directives: Vec<Directive>,
pub fields: Vec<FieldDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnionTypeExtension {
pub name: String,
pub directives: Vec<Directive>,
pub types: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EnumTypeExtension {
pub name: String,
pub directives: Vec<Directive>,
pub values: Vec<EnumValueDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InputObjectTypeExtension {
pub name: String,
pub directives: Vec<Directive>,
pub fields: Vec<InputValueDefinition>,
}