use crate::{InputValueResult, ScalarType, Value}; use async_graphql_derive::Scalar; use serde::de::DeserializeOwned; /// Any scalar /// /// The `Any` scalar is used to pass representations of entities from external services into the root `_entities` field for execution. #[derive(Clone, PartialEq, Debug)] pub struct Any(pub Value); /// The `_Any` scalar is used to pass representations of entities from external services into the root `_entities` field for execution. #[Scalar(internal, name = "_Any")] impl ScalarType for Any { fn parse(value: Value) -> InputValueResult { Ok(Self(value)) } fn is_valid(_value: &Value) -> bool { true } fn to_value(&self) -> Value { self.0.clone() } } impl Any { /// Parse this `Any` value to T by `serde_json`. pub fn parse_value(&self) -> std::result::Result { serde_json::from_value(self.to_value().into()) } } impl From for Any where T: Into, { fn from(value: T) -> Any { Any(value.into()) } } #[cfg(test)] mod test { use super::*; #[test] fn test_conversion_ok() { let value = Value::List(vec![ Value::Number(1.into()), Value::Boolean(true), Value::Null, ]); let expected = Any(value.clone()); let output: Any = value.into(); assert_eq!(output, expected); } }