use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GraphQlResponse<T> {
pub data: Option<T>,
#[serde(default)]
pub errors: Vec<GraphQlError>,
}
impl<T> GraphQlResponse<T> {
pub fn has_errors(&self) -> bool {
!self.errors.is_empty()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GraphQlError {
pub message: String,
#[serde(default)]
pub locations: Vec<GraphQlLocation>,
#[serde(default)]
pub path: Vec<serde_json::Value>,
#[serde(default)]
pub extensions: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GraphQlLocation {
pub line: i64,
pub column: i64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_has_errors() {
let ok: GraphQlResponse<serde_json::Value> = GraphQlResponse {
data: Some(serde_json::json!({"ok": true})),
errors: vec![],
};
assert!(!ok.has_errors());
let err = GraphQlResponse::<serde_json::Value> {
data: None,
errors: vec![GraphQlError {
message: "boom".to_string(),
locations: vec![],
path: vec![],
extensions: None,
}],
};
assert!(err.has_errors());
}
}