postrust_graphql/
scalar.rs

1//! Custom GraphQL scalar definitions.
2
3use async_graphql::{InputValueError, InputValueResult, Scalar, ScalarType, Value};
4
5/// BigInt scalar for 64-bit integers.
6#[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}