sui_graphql/
response.rs

1//! Response type for GraphQL queries.
2
3use crate::error::GraphQLError;
4
5/// A GraphQL response containing data and/or errors.
6///
7/// GraphQL responses can have three states:
8/// - Success: `data` is present, `errors` is empty
9/// - Partial success: `data` is present AND `errors` is non-empty
10/// - Failure: `data` is None, `errors` is non-empty
11#[derive(Debug)]
12pub struct Response<T> {
13    data: Option<T>,
14    errors: Vec<GraphQLError>,
15}
16
17impl<T> Response<T> {
18    /// Create a new response with data and errors.
19    pub(crate) fn new(data: Option<T>, errors: Vec<GraphQLError>) -> Self {
20        Self { data, errors }
21    }
22
23    /// The deserialized data from the response, if present.
24    pub fn data(&self) -> Option<&T> {
25        self.data.as_ref()
26    }
27
28    /// Consumes the response and returns the data, if present.
29    pub fn into_data(self) -> Option<T> {
30        self.data
31    }
32
33    /// Returns true if the response has any errors.
34    pub fn has_errors(&self) -> bool {
35        !self.errors.is_empty()
36    }
37
38    /// Returns all errors from the response.
39    pub fn errors(&self) -> &[GraphQLError] {
40        &self.errors
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47
48    fn make_error() -> GraphQLError {
49        serde_json::from_value(serde_json::json!({
50            "message": "test error",
51            "path": ["field"]
52        }))
53        .unwrap()
54    }
55
56    #[test]
57    fn test_response_no_errors() {
58        let response: Response<String> = Response::new(Some("data".to_string()), vec![]);
59        assert!(!response.has_errors());
60        assert!(response.errors().is_empty());
61    }
62
63    #[test]
64    fn test_response_with_errors() {
65        let response: Response<String> =
66            Response::new(Some("data".to_string()), vec![make_error()]);
67        assert!(response.has_errors());
68        assert_eq!(response.errors().len(), 1);
69    }
70}