use crate::FileId;
use crate::Node;
use crate::NodeStr;
use crate::SourceFile;
use std::collections::HashMap;
use std::sync::Arc;
pub(crate) mod from_cst;
pub(crate) mod impls;
pub(crate) mod serialize;
pub use self::serialize::Serialize;
#[derive(Clone)]
pub struct Document {
pub source: Option<(FileId, Arc<SourceFile>)>,
pub definitions: Vec<Definition>,
}
const _: () = {
const fn assert_send<T: Send>() {}
const fn assert_sync<T: Sync>() {}
assert_send::<Document>();
assert_sync::<Document>();
};
pub type Name = NodeStr;
pub type NamedType = Name;
#[derive(Clone, Eq, PartialEq, Hash)]
pub enum Definition {
OperationDefinition(Node<OperationDefinition>),
FragmentDefinition(Node<FragmentDefinition>),
DirectiveDefinition(Node<DirectiveDefinition>),
SchemaDefinition(Node<SchemaDefinition>),
ScalarTypeDefinition(Node<ScalarTypeDefinition>),
ObjectTypeDefinition(Node<ObjectTypeDefinition>),
InterfaceTypeDefinition(Node<InterfaceTypeDefinition>),
UnionTypeDefinition(Node<UnionTypeDefinition>),
EnumTypeDefinition(Node<EnumTypeDefinition>),
InputObjectTypeDefinition(Node<InputObjectTypeDefinition>),
SchemaExtension(Node<SchemaExtension>),
ScalarTypeExtension(Node<ScalarTypeExtension>),
ObjectTypeExtension(Node<ObjectTypeExtension>),
InterfaceTypeExtension(Node<InterfaceTypeExtension>),
UnionTypeExtension(Node<UnionTypeExtension>),
EnumTypeExtension(Node<EnumTypeExtension>),
InputObjectTypeExtension(Node<InputObjectTypeExtension>),
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct OperationDefinition {
pub operation_type: OperationType,
pub name: Option<Name>,
pub variables: Vec<Node<VariableDefinition>>,
pub directives: Directives,
pub selection_set: Vec<Selection>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct FragmentDefinition {
pub name: Name,
pub type_condition: NamedType,
pub directives: Directives,
pub selection_set: Vec<Selection>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct DirectiveDefinition {
pub description: Option<NodeStr>,
pub name: Name,
pub arguments: Vec<Node<InputValueDefinition>>,
pub repeatable: bool,
pub locations: Vec<DirectiveLocation>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct SchemaDefinition {
pub description: Option<NodeStr>,
pub directives: Directives,
pub root_operations: Vec<Node<(OperationType, NamedType)>>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct ScalarTypeDefinition {
pub description: Option<NodeStr>,
pub name: Name,
pub directives: Directives,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct ObjectTypeDefinition {
pub description: Option<NodeStr>,
pub name: Name,
pub implements_interfaces: Vec<Name>,
pub directives: Directives,
pub fields: Vec<Node<FieldDefinition>>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct InterfaceTypeDefinition {
pub description: Option<NodeStr>,
pub name: Name,
pub implements_interfaces: Vec<Name>,
pub directives: Directives,
pub fields: Vec<Node<FieldDefinition>>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct UnionTypeDefinition {
pub description: Option<NodeStr>,
pub name: Name,
pub directives: Directives,
pub members: Vec<NamedType>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct EnumTypeDefinition {
pub description: Option<NodeStr>,
pub name: Name,
pub directives: Directives,
pub values: Vec<Node<EnumValueDefinition>>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct InputObjectTypeDefinition {
pub description: Option<NodeStr>,
pub name: Name,
pub directives: Directives,
pub fields: Vec<Node<InputValueDefinition>>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct SchemaExtension {
pub directives: Directives,
pub root_operations: Vec<Node<(OperationType, NamedType)>>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct ScalarTypeExtension {
pub name: Name,
pub directives: Directives,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct ObjectTypeExtension {
pub name: Name,
pub implements_interfaces: Vec<Name>,
pub directives: Directives,
pub fields: Vec<Node<FieldDefinition>>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct InterfaceTypeExtension {
pub name: Name,
pub implements_interfaces: Vec<Name>,
pub directives: Directives,
pub fields: Vec<Node<FieldDefinition>>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct UnionTypeExtension {
pub name: Name,
pub directives: Directives,
pub members: Vec<NamedType>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct EnumTypeExtension {
pub name: Name,
pub directives: Directives,
pub values: Vec<Node<EnumValueDefinition>>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct InputObjectTypeExtension {
pub name: Name,
pub directives: Directives,
pub fields: Vec<Node<InputValueDefinition>>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct Argument {
pub name: Name,
pub value: Node<Value>,
}
#[derive(Clone, Eq, PartialEq, Hash, Default)]
pub struct Directives(pub Vec<Node<Directive>>);
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct Directive {
pub name: Name,
pub arguments: Vec<Node<Argument>>,
}
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
pub enum OperationType {
Query,
Mutation,
Subscription,
}
#[derive(Copy, Clone, Hash, PartialEq, Eq)]
pub enum DirectiveLocation {
Query,
Mutation,
Subscription,
Field,
FragmentDefinition,
FragmentSpread,
InlineFragment,
VariableDefinition,
Schema,
Scalar,
Object,
FieldDefinition,
ArgumentDefinition,
Interface,
Union,
Enum,
EnumValue,
InputObject,
InputFieldDefinition,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct VariableDefinition {
pub name: Name,
pub ty: Node<Type>,
pub default_value: Option<Node<Value>>,
pub directives: Directives,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub enum Type {
Named(NamedType),
NonNullNamed(NamedType),
List(Box<Type>),
NonNullList(Box<Type>),
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct FieldDefinition {
pub description: Option<NodeStr>,
pub name: Name,
pub arguments: Vec<Node<InputValueDefinition>>,
pub ty: Type,
pub directives: Directives,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct InputValueDefinition {
pub description: Option<NodeStr>,
pub name: Name,
pub ty: Node<Type>,
pub default_value: Option<Node<Value>>,
pub directives: Directives,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct EnumValueDefinition {
pub description: Option<NodeStr>,
pub value: Name,
pub directives: Directives,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub enum Selection {
Field(Node<Field>),
FragmentSpread(Node<FragmentSpread>),
InlineFragment(Node<InlineFragment>),
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct Field {
pub alias: Option<Name>,
pub name: Name,
pub arguments: Vec<Node<Argument>>,
pub directives: Directives,
pub selection_set: Vec<Selection>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct FragmentSpread {
pub fragment_name: Name,
pub directives: Directives,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct InlineFragment {
pub type_condition: Option<NamedType>,
pub directives: Directives,
pub selection_set: Vec<Selection>,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub enum Value {
Null,
Enum(Name),
Variable(Name),
String(
NodeStr,
),
Float(FloatValue),
Int(IntValue),
Boolean(bool),
List(Vec<Node<Value>>),
Object(Vec<(Name, Node<Value>)>),
}
#[derive(Clone, Eq, PartialEq, Hash)]
pub struct IntValue(String);
#[derive(Clone, Eq, PartialEq, Hash)]
pub struct FloatValue(String);
#[derive(Clone, Eq, PartialEq)]
#[non_exhaustive]
pub struct FloatOverflowError {}
pub(crate) trait Extensible {
type Extension;
}
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub(crate) struct TypeWithExtensions<T: Extensible> {
pub definition: Node<T>,
pub extensions: Vec<Node<T::Extension>>,
}
#[derive(Debug, PartialEq, Eq)]
pub(crate) struct TypeSystem {
pub schema: TypeWithExtensions<SchemaDefinition>,
pub objects: HashMap<Name, TypeWithExtensions<ObjectTypeDefinition>>,
pub scalars: HashMap<Name, TypeWithExtensions<ScalarTypeDefinition>>,
pub interfaces: HashMap<Name, TypeWithExtensions<InterfaceTypeDefinition>>,
pub unions: HashMap<Name, TypeWithExtensions<UnionTypeDefinition>>,
pub enums: HashMap<Name, TypeWithExtensions<EnumTypeDefinition>>,
pub input_objects: HashMap<Name, TypeWithExtensions<InputObjectTypeDefinition>>,
}