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}