graphql_tools/validation/
utils.rs1use 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}