mod ast;
mod builders;
mod flatten;
mod indent;
mod input_literal_ser;
mod recurse;
mod type_eq;
mod variables;
use variables::VariableDefinitions;
use crate::QueryVariableLiterals;
pub use self::{
ast::{Argument, InputLiteral, SelectionSet},
builders::{SelectionBuilder, VariableMatch},
flatten::FlattensInto,
input_literal_ser::to_input_literal,
recurse::Recursable,
type_eq::IsFieldType,
};
use std::{collections::HashSet, rc::Rc, sync::mpsc};
pub fn build_executable_document<Fragment, Variables>(
r#type: OperationType,
operation_name: Option<&str>,
features_enabled: HashSet<String>,
inline_variables: Option<&dyn QueryVariableLiterals>,
) -> String
where
Fragment: crate::QueryFragment,
Variables: crate::QueryVariables,
{
let features_enabled = Rc::new(features_enabled);
let mut selection_set = SelectionSet::default();
let (variable_tx, variable_rx) = mpsc::channel();
let builder = SelectionBuilder::<_, Fragment::VariablesFields>::new(
&mut selection_set,
&variable_tx,
&features_enabled,
inline_variables,
);
Fragment::query(builder);
let vars = VariableDefinitions::new::<Variables>(variable_rx.try_iter().collect());
let name_str = operation_name.unwrap_or("");
let declaration_str = r#type.as_str();
format!("{declaration_str} {name_str}{vars}{selection_set}")
}
pub enum OperationType {
Query,
Mutation,
Subscription,
}
impl OperationType {
pub fn as_str(&self) -> &'static str {
match self {
OperationType::Query => "query",
OperationType::Mutation => "mutation",
OperationType::Subscription => "subscription",
}
}
}