use indexmap::IndexSet;
pub mod ids;
mod definition;
mod generated;
mod value;
mod types;
pub mod writer;
pub use self::{
definition::ExecutableDefinition,
generated::{
argument::Argument,
directive::Directive,
fragment::FragmentDefinition,
operation::OperationDefinition,
selections::{FieldSelection, FragmentSpread, InlineFragment, Selection},
variable::VariableDefinition,
},
types::Type,
value::Value,
};
#[derive(Default)]
pub struct ExecutableDocument {
strings: IndexSet<Box<str>>,
block_strings: Vec<Box<str>>,
definitions: Vec<definition::ExecutableDefinitionRecord>,
operations: Vec<storage::OperationDefinitionRecord>,
fragments: Vec<storage::FragmentDefinitionRecord>,
selections: Vec<storage::SelectionRecord>,
field_selections: Vec<storage::FieldSelectionRecord>,
inline_fragments: Vec<storage::InlineFragmentRecord>,
fragment_spreads: Vec<storage::FragmentSpreadRecord>,
directives: Vec<storage::DirectiveRecord>,
arguments: Vec<storage::ArgumentRecord>,
variables: Vec<storage::VariableDefinitionRecord>,
types: Vec<types::TypeRecord>,
values: Vec<value::ValueRecord>,
}
pub trait ExecutableId: Copy {
type Reader<'a>: From<ReadContext<'a, Self>>;
fn read(self, ast: &ExecutableDocument) -> Self::Reader<'_> {
ReadContext {
id: self,
document: ast,
}
.into()
}
}
#[derive(Clone, Copy)]
pub struct ReadContext<'a, I> {
id: I,
document: &'a ExecutableDocument,
}
impl ExecutableDocument {
pub fn read<T>(&self, id: T) -> T::Reader<'_>
where
T: ExecutableId,
{
ReadContext { id, document: self }.into()
}
}
pub mod storage {
pub use super::{
definition::ExecutableDefinitionRecord,
generated::{
argument::ArgumentRecord,
directive::DirectiveRecord,
fragment::FragmentDefinitionRecord,
operation::OperationDefinitionRecord,
selections::{
FieldSelectionRecord, FragmentSpreadRecord, InlineFragmentRecord, SelectionRecord,
},
variable::VariableDefinitionRecord,
},
types::TypeRecord,
value::ValueRecord,
};
}