graphql_tools/validation/
utils.rs

1use crate::parser::Pos;
2use serde::ser::*;
3use serde::{Serialize, Serializer};
4use serde_with::{serde_as, SerializeAs};
5use std::fmt::Debug;
6
7#[derive(Debug, Default)]
8pub struct ValidationErrorContext {
9    pub errors: Vec<ValidationError>,
10}
11
12impl ValidationErrorContext {
13    pub fn new() -> ValidationErrorContext {
14        ValidationErrorContext { errors: vec![] }
15    }
16
17    pub fn report_error(&mut self, error: ValidationError) {
18        self.errors.push(error);
19    }
20}
21
22struct PositionDef;
23
24impl SerializeAs<Pos> for PositionDef {
25    fn serialize_as<S>(value: &Pos, serializer: S) -> Result<S::Ok, S::Error>
26    where
27        S: Serializer,
28    {
29        let mut s = serializer.serialize_map(Some(2))?;
30        s.serialize_entry("line", &value.line)?;
31        s.serialize_entry("column", &value.column)?;
32        s.end()
33    }
34}
35
36#[serde_as]
37#[derive(Serialize, Debug, Clone)]
38pub struct ValidationError {
39    #[serde_as(as = "Vec<PositionDef>")]
40    pub locations: Vec<Pos>,
41    pub message: String,
42    #[serde(skip_serializing)]
43    pub error_code: &'static str,
44}
45
46#[test]
47fn serialization_test() {
48    let error = ValidationError {
49        locations: vec![Pos { line: 1, column: 2 }],
50        message: "test".to_string(),
51        error_code: "test",
52    };
53    let serialized = serde_json::to_string(&error).unwrap();
54    assert_eq!(
55        serialized,
56        r#"{"locations":[{"line":1,"column":2}],"message":"test"}"#
57    );
58}
59
60#[test]
61fn serialization_test_vec() {
62    let error = ValidationError {
63        locations: vec![Pos { line: 1, column: 2 }],
64        message: "test".to_string(),
65        error_code: "test",
66    };
67    let serialized = serde_json::to_string(&vec![error]).unwrap();
68    assert_eq!(
69        serialized,
70        r#"[{"locations":[{"line":1,"column":2}],"message":"test"}]"#
71    );
72}