1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
use crate::{Scalar, SerializeError}; pub struct Argument { pub(crate) name: String, pub(crate) value: Box<dyn SerializableArgument + Send>, pub(crate) type_: String, } impl Argument { pub fn new( name: &str, gql_type: &str, value: impl SerializableArgument + 'static + Send, ) -> Argument { Argument { name: name.to_string(), value: Box::new(value), type_: gql_type.to_string(), } } } impl serde::Serialize for Argument { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer, { use serde::ser::Error; match self.value.serialize() { Ok(json_val) => serde::Serialize::serialize(&json_val, serializer), Err(e) => Err(S::Error::custom(e.to_string())), } } } pub trait SerializableArgument { fn serialize(&self) -> Result<serde_json::Value, SerializeError>; } impl<T: SerializableArgument> SerializableArgument for Vec<T> { fn serialize(&self) -> Result<serde_json::Value, SerializeError> { self.iter() .map(|s| s.serialize()) .collect::<Result<Vec<_>, _>>() .map(serde_json::Value::Array) } } impl<T: SerializableArgument> SerializableArgument for Option<T> { fn serialize(&self) -> Result<serde_json::Value, SerializeError> { match self { Some(inner) => Ok(inner.serialize()?), None => Ok(serde_json::Value::Null), } } } impl<T: Scalar> SerializableArgument for T { fn serialize(&self) -> Result<serde_json::Value, SerializeError> { self.encode() } }