Trait juniper::ScalarValue [−][src]
pub trait ScalarValue: Debug + Display + PartialEq + Clone + Serialize + From<String> + From<bool> + From<i32> + From<f64> + 'static { type Visitor: for<'de> Visitor<'de, Value = Self> + Default; fn as_int(&self) -> Option<i32>; fn as_string(&self) -> Option<String>; fn into_string(self) -> Option<String>; fn as_str(&self) -> Option<&str>; fn as_float(&self) -> Option<f64>; fn as_boolean(&self) -> Option<bool>; fn is_type<'a, T>(&'a self) -> bool
where
T: 'a,
&'a Self: Into<Option<&'a T>>, { ... } fn into_another<S: ScalarValue>(self) -> S { ... } }
Expand description
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]
Expand description
Serde visitor used to deserialize this scalar value
Required methods
fn as_int(&self) -> Option<i32>
[src]
Expand description
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.
fn as_string(&self) -> Option<String>
[src]
Expand description
Represents this ScalarValue
a String
value.
This function is used for implementing GraphQLValue
for String
for all
scalar values
fn into_string(self) -> Option<String>
[src]
Expand description
Converts this ScalarValue
into a String
value.
Same as ScalarValue::as_string
, but takes ownership, so allows to omit redundant
cloning.
fn as_str(&self) -> Option<&str>
[src]
Expand description
Convert the given scalar value into a string value
This function is used for implementing GraphQLValue
for String
for all
scalar values
fn as_float(&self) -> Option<f64>
[src]
Expand description
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.
fn as_boolean(&self) -> Option<bool>
[src]
Expand description
Convert the given scalar value into a boolean value
This function is used for implementing GraphQLValue
for bool
for all
scalar values.
Provided methods
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>>,
Expand description
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);
fn into_another<S: ScalarValue>(self) -> S
[src]
Expand description
Converts this ScalarValue
into another one.
Implementors
impl ScalarValue for DefaultScalarValue
[src]
impl ScalarValue for DefaultScalarValue
[src]