2020-04-15 03:15:30 +00:00
|
|
|
|
# 自定义标量
|
2020-04-19 02:17:47 +00:00
|
|
|
|
|
|
|
|
|
`Async-graphql`已经内置了绝大部分常用的标量类型,同时你也能自定义标量。
|
|
|
|
|
|
|
|
|
|
实现`Async-graphql::Scalar`即可自定义一个标量,你只需要实现一个解析函数和输出函数。
|
|
|
|
|
|
|
|
|
|
下面的例子定义一个64位整数标量,但它的输入输出都是字符串。 (`Async-graphql`已经内置了对64位整数的支持,正是采用字符串作为输入输出)
|
|
|
|
|
|
|
|
|
|
```rust
|
2022-06-02 21:32:12 +00:00
|
|
|
|
# extern crate async_graphql;
|
2020-04-19 02:17:47 +00:00
|
|
|
|
use async_graphql::*;
|
|
|
|
|
|
2020-04-29 08:38:11 +00:00
|
|
|
|
|
2020-04-19 02:17:47 +00:00
|
|
|
|
struct StringNumber(i64);
|
|
|
|
|
|
2020-09-18 00:52:13 +00:00
|
|
|
|
#[Scalar]
|
2020-04-28 02:32:26 +00:00
|
|
|
|
impl ScalarType for StringNumber {
|
2020-05-11 13:47:24 +00:00
|
|
|
|
fn parse(value: Value) -> InputValueResult<Self> {
|
2020-07-28 14:13:07 +00:00
|
|
|
|
if let Value::String(value) = &value {
|
2020-04-19 02:17:47 +00:00
|
|
|
|
// 解析整数
|
2020-07-28 14:13:07 +00:00
|
|
|
|
Ok(value.parse().map(StringNumber)?)
|
2020-04-19 02:17:47 +00:00
|
|
|
|
} else {
|
2020-05-10 10:27:46 +00:00
|
|
|
|
// 类型不匹配
|
2020-10-04 09:21:53 +00:00
|
|
|
|
Err(InputValueError::expected_type(value))
|
2020-04-19 02:17:47 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-29 08:38:11 +00:00
|
|
|
|
|
2020-05-26 15:27:50 +00:00
|
|
|
|
fn to_value(&self) -> Value {
|
|
|
|
|
Value::String(self.0.to_string())
|
2020-04-29 08:38:11 +00:00
|
|
|
|
}
|
2020-04-19 02:17:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-04-29 08:38:11 +00:00
|
|
|
|
```
|
2020-10-12 23:35:30 +00:00
|
|
|
|
|
|
|
|
|
## 使用`scalar!`宏定义标量
|
|
|
|
|
|
|
|
|
|
如果你的类型实现了`serde :: Serialize`和`serde :: Deserialize`,那么可以使用此宏更简单地定义标量。
|
|
|
|
|
|
|
|
|
|
```rust
|
2022-06-02 21:32:12 +00:00
|
|
|
|
# extern crate async_graphql;
|
|
|
|
|
# extern crate serde;
|
|
|
|
|
# use async_graphql::*;
|
|
|
|
|
# use serde::{Serialize, Deserialize};
|
|
|
|
|
# use std::collections::HashMap;
|
2020-10-12 23:35:30 +00:00
|
|
|
|
#[derive(Serialize, Deserialize)]
|
|
|
|
|
struct MyValue {
|
|
|
|
|
a: i32,
|
|
|
|
|
b: HashMap<String, i32>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
scalar!(MyValue);
|
|
|
|
|
|
|
|
|
|
// 重命名为`MV`.
|
|
|
|
|
// scalar!(MyValue, "MV");
|
|
|
|
|
|
|
|
|
|
// 重命名为`MV`并且添加描述.
|
|
|
|
|
// scalar!(MyValue, "MV", "This is my value");
|
|
|
|
|
```
|