postrust_graphql/
scalar.rs1use async_graphql::{InputValueError, InputValueResult, Scalar, ScalarType, Value};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub struct BigInt(pub i64);
8
9#[Scalar]
10impl ScalarType for BigInt {
11 fn parse(value: Value) -> InputValueResult<Self> {
12 match &value {
13 Value::Number(n) => {
14 if let Some(i) = n.as_i64() {
15 Ok(BigInt(i))
16 } else {
17 Err(InputValueError::expected_type(value))
18 }
19 }
20 Value::String(s) => s
21 .parse::<i64>()
22 .map(BigInt)
23 .map_err(|_| InputValueError::expected_type(value)),
24 _ => Err(InputValueError::expected_type(value)),
25 }
26 }
27
28 fn to_value(&self) -> Value {
29 Value::Number(self.0.into())
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use super::*;
36 use pretty_assertions::assert_eq;
37
38 #[test]
39 fn test_bigint_parse_number() {
40 let value = Value::Number(42.into());
41 let result = BigInt::parse(value).unwrap();
42 assert_eq!(result.0, 42);
43 }
44
45 #[test]
46 fn test_bigint_parse_string() {
47 let value = Value::String("9223372036854775807".into());
48 let result = BigInt::parse(value).unwrap();
49 assert_eq!(result.0, i64::MAX);
50 }
51
52 #[test]
53 fn test_bigint_to_value() {
54 let bigint = BigInt(42);
55 let value = bigint.to_value();
56 assert_eq!(value, Value::Number(42.into()));
57 }
58
59 #[test]
60 fn test_bigint_parse_invalid() {
61 let value = Value::Boolean(true);
62 let result = BigInt::parse(value);
63 assert!(result.is_err());
64 }
65}