use std::fmt;
use crate::{InputValueDefinition, Value};
#[derive(Debug, Default, PartialEq, Clone)]
pub struct ArgumentsDefinition {
pub(crate) input_values: Vec<InputValueDefinition>,
}
impl ArgumentsDefinition {
pub fn new() -> Self {
Self {
input_values: Vec::new(),
}
}
pub fn with_values(input_values: Vec<InputValueDefinition>) -> Self {
Self { input_values }
}
pub fn input_value(&mut self, input_value: InputValueDefinition) {
self.input_values.push(input_value)
}
}
impl fmt::Display for ArgumentsDefinition {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "(")?;
for (i, input_val_def) in self.input_values.iter().enumerate() {
if input_val_def.description.is_some() {
if i != self.input_values.len() - 1 {
write!(f, "{},", input_val_def)?;
} else {
writeln!(f, "{}", input_val_def)?;
}
} else if i != self.input_values.len() - 1 {
write!(f, "{}, ", input_val_def)?;
} else {
write!(f, "{}", input_val_def)?;
}
}
if self
.input_values
.iter()
.any(|input| input.description.is_some())
{
write!(f, " )")
} else {
write!(f, ")")
}
}
}
#[derive(Debug, PartialEq, Clone)]
pub struct Argument {
name: String,
value: Value,
}
impl Argument {
pub fn new(name: String, value: Value) -> Self {
Self { name, value }
}
}
impl fmt::Display for Argument {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}: {}", self.name, self.value)
}
}
#[cfg(test)]
mod tests {
use crate::Type_;
use super::*;
#[test]
fn it_encodes_argument() {
let argument = Argument::new(String::from("argName"), Value::String("value".to_string()));
assert_eq!(argument.to_string(), r#"argName: "value""#);
}
#[test]
fn it_encodes_arguments_definitions() {
let input_value_defs = vec![
InputValueDefinition::new(
String::from("first"),
Type_::NamedType {
name: String::from("Int"),
},
),
InputValueDefinition::new(
String::from("second"),
Type_::List {
ty: Box::new(Type_::NamedType {
name: String::from("Int"),
}),
},
),
];
let arguments_def = ArgumentsDefinition::with_values(input_value_defs);
assert_eq!(arguments_def.to_string(), r#"(first: Int, second: [Int])"#);
}
}