[−][src]Trait juniper::ScalarValue
A trait marking a type that could be used as internal representation of scalar values in juniper
The main objective of this abstraction is to allow other libraries to
replace the default representation with something that better fits their
needs.
There is a custom derive (#[derive(juniper::GraphQLScalarValue)]
) available that implements
most of the required traits automatically for a enum representing a scalar value.
This derives needs a additional annotation of the form
#[juniper(visitor = "VisitorType")]
to specify a type that implements
serde::de::Visitor
and that is used to deserialize the value.
Implementing a new scalar value representation
The preferred way to define a new scalar value representation is defining a enum containing a variant for each type that needs to be represented at the lowest level. The following example introduces an new variant that is able to store 64 bit integers.
#[derive(Debug, Clone, PartialEq, juniper::GraphQLScalarValue)] enum MyScalarValue { Int(i32), Long(i64), Float(f64), String(String), Boolean(bool), } impl ScalarValue for MyScalarValue { type Visitor = MyScalarValueVisitor; fn as_int(&self) -> Option<i32> { match *self { Self::Int(ref i) => Some(*i), _ => None, } } fn as_string(&self) -> Option<String> { match *self { Self::String(ref s) => Some(s.clone()), _ => None, } } fn into_string(self) -> Option<String> { match self { Self::String(s) => Some(s), _ => None, } } fn as_str(&self) -> Option<&str> { match *self { Self::String(ref s) => Some(s.as_str()), _ => None, } } fn as_float(&self) -> Option<f64> { match *self { Self::Int(ref i) => Some(*i as f64), Self::Float(ref f) => Some(*f), _ => None, } } fn as_boolean(&self) -> Option<bool> { match *self { Self::Boolean(ref b) => Some(*b), _ => None, } } } #[derive(Default)] struct MyScalarValueVisitor; impl<'de> de::Visitor<'de> for MyScalarValueVisitor { type Value = MyScalarValue; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a valid input value") } fn visit_bool<E>(self, value: bool) -> Result<MyScalarValue, E> { Ok(MyScalarValue::Boolean(value)) } fn visit_i32<E>(self, value: i32) -> Result<MyScalarValue, E> where E: de::Error, { Ok(MyScalarValue::Int(value)) } fn visit_i64<E>(self, value: i64) -> Result<MyScalarValue, E> where E: de::Error, { if value <= i32::max_value() as i64 { self.visit_i32(value as i32) } else { Ok(MyScalarValue::Long(value)) } } fn visit_u32<E>(self, value: u32) -> Result<MyScalarValue, E> where E: de::Error, { if value <= i32::max_value() as u32 { self.visit_i32(value as i32) } else { self.visit_u64(value as u64) } } fn visit_u64<E>(self, value: u64) -> Result<MyScalarValue, E> where E: de::Error, { if value <= i64::max_value() as u64 { self.visit_i64(value as i64) } else { // Browser's JSON.stringify serialize all numbers having no // fractional part as integers (no decimal point), so we // must parse large integers as floating point otherwise // we would error on transferring large floating point // numbers. Ok(MyScalarValue::Float(value as f64)) } } fn visit_f64<E>(self, value: f64) -> Result<MyScalarValue, E> { Ok(MyScalarValue::Float(value)) } fn visit_str<E>(self, value: &str) -> Result<MyScalarValue, E> where E: de::Error, { self.visit_string(value.into()) } fn visit_string<E>(self, value: String) -> Result<MyScalarValue, E> { Ok(MyScalarValue::String(value)) } }
Associated Types
type Visitor: for<'de> Visitor<'de, Value = Self> + Default
[src]
Serde visitor used to deserialize this scalar value
Required methods
pub fn as_int(&self) -> Option<i32>
[src]
Convert the given scalar value into an integer value
This function is used for implementing GraphQLValue
for i32
for all
scalar values. Implementations should convert all supported integer
types with 32 bit or less to an integer if requested.
pub fn as_string(&self) -> Option<String>
[src]
Represents this ScalarValue
a String
value.
This function is used for implementing GraphQLValue
for String
for all
scalar values
pub fn into_string(self) -> Option<String>
[src]
Converts this ScalarValue
into a String
value.
Same as ScalarValue::as_string
, but takes ownership, so allows to omit redundant
cloning.
pub fn as_str(&self) -> Option<&str>
[src]
Convert the given scalar value into a string value
This function is used for implementing GraphQLValue
for String
for all
scalar values
pub fn as_float(&self) -> Option<f64>
[src]
Convert the given scalar value into a float value
This function is used for implementing GraphQLValue
for f64
for all
scalar values. Implementations should convert all supported integer
types with 64 bit or less and all floating point values with 64 bit or
less to a float if requested.
pub fn as_boolean(&self) -> Option<bool>
[src]
Convert the given scalar value into a boolean value
This function is used for implementing GraphQLValue
for bool
for all
scalar values.
Provided methods
pub fn is_type<'a, T>(&'a self) -> bool where
T: 'a,
&'a Self: Into<Option<&'a T>>,
[src]
T: 'a,
&'a Self: Into<Option<&'a T>>,
Checks if the current value contains the a value of the current type
let value = DefaultScalarValue::Int(42); assert_eq!(value.is_type::<i32>(), true); assert_eq!(value.is_type::<f64>(), false);
pub fn into_another<S: ScalarValue>(self) -> S
[src]
Converts this ScalarValue
into another one.