use std::fmt;
use crate::{Directive, StringValue};
#[derive(Debug, Clone)]
pub struct SchemaDefinition {
description: Option<StringValue>,
query: Option<String>,
mutation: Option<String>,
subscription: Option<String>,
directives: Vec<Directive>,
extend: bool,
}
impl SchemaDefinition {
pub fn new() -> Self {
Self {
description: None,
query: None,
mutation: None,
subscription: None,
directives: Vec::new(),
extend: false,
}
}
pub fn description(&mut self, description: String) {
self.description = Some(StringValue::Top {
source: description,
});
}
pub fn directive(&mut self, directive: Directive) {
self.directives.push(directive);
}
pub fn extend(&mut self) {
self.extend = true;
}
pub fn query(&mut self, query: String) {
self.query = Some(query);
}
pub fn mutation(&mut self, mutation: String) {
self.mutation = Some(mutation);
}
pub fn subscription(&mut self, subscription: String) {
self.subscription = Some(subscription);
}
}
impl Default for SchemaDefinition {
fn default() -> Self {
Self::new()
}
}
impl fmt::Display for SchemaDefinition {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.extend {
write!(f, "extend ")?;
} else if let Some(description) = &self.description {
write!(f, "{}", description)?;
}
write!(f, "schema")?;
for directive in &self.directives {
write!(f, " {}", directive)?;
}
writeln!(f, " {{")?;
if let Some(query) = &self.query {
writeln!(f, " query: {}", query)?;
}
if let Some(mutation) = &self.mutation {
writeln!(f, " mutation: {}", mutation)?;
}
if let Some(subscription) = &self.subscription {
writeln!(f, " subscription: {}", subscription)?;
}
writeln!(f, "}}")
}
}
#[cfg(test)]
mod tests {
use super::*;
use indoc::indoc;
use pretty_assertions::assert_eq;
#[test]
fn it_encodes_schema_with_mutation_and_subscription() {
let mut schema_def = SchemaDefinition::new();
schema_def.query("TryingToFindCatQuery".to_string());
schema_def.mutation("MyMutation".to_string());
schema_def.subscription("MySubscription".to_string());
assert_eq!(
schema_def.to_string(),
indoc! { r#"
schema {
query: TryingToFindCatQuery
mutation: MyMutation
subscription: MySubscription
}
"#}
);
}
#[test]
fn it_encodes_extend_schema_with_mutation_and_subscription() {
let mut schema_def = SchemaDefinition::new();
schema_def.query("TryingToFindCatQuery".to_string());
schema_def.mutation("MyMutation".to_string());
schema_def.subscription("MySubscription".to_string());
schema_def.extend();
assert_eq!(
schema_def.to_string(),
indoc! { r#"
extend schema {
query: TryingToFindCatQuery
mutation: MyMutation
subscription: MySubscription
}
"#}
);
}
}