In Async-graphql
most common scalar types are built in, but you can also create your own scalar types.
Using async-graphql::Scalar
, you can add support for a scalar when you implement it. You only need to implement parsing and output functions.
The following example defines a 64-bit integer scalar where its input and output are strings.
#![allow(unused)]
fn main() {
extern crate async_graphql;
use async_graphql::*;
struct StringNumber(i64);
#[Scalar]
impl ScalarType for StringNumber {
fn parse(value: Value) -> InputValueResult<Self> {
if let Value::String(value) = &value {
Ok(value.parse().map(StringNumber)?)
} else {
Err(InputValueError::expected_type(value))
}
}
fn to_value(&self) -> Value {
Value::String(self.0.to_string())
}
}
}
If your type implemented serde::Serialize
and serde::Deserialize
, then you can use this macro to define a scalar more simply.
#![allow(unused)]
fn main() {
extern crate async_graphql;
extern crate serde;
use async_graphql::*;
use serde::{Serialize, Deserialize};
use std::collections::HashMap;
#[derive(Serialize, Deserialize)]
struct MyValue {
a: i32,
b: HashMap<String, i32>,
}
scalar!(MyValue);
}