use juniper::{ExecutionError, Value};
use serde::Serialize;
pub use crate::server_message::ErrorPayload;
#[derive(Debug, Eq, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ConnectionErrorPayload {
pub message: String,
}
#[derive(Debug, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DataPayload<S> {
pub data: Value<S>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub errors: Vec<ExecutionError<S>>,
}
#[derive(Debug, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
#[serde(tag = "type")]
pub enum ServerMessage<S> {
ConnectionError {
payload: ConnectionErrorPayload,
},
ConnectionAck,
Data {
id: String,
payload: DataPayload<S>,
},
Error {
id: String,
payload: ErrorPayload,
},
Complete {
id: String,
},
#[serde(rename = "ka")]
ConnectionKeepAlive,
}
#[cfg(test)]
mod test {
use juniper::{DefaultScalarValue, GraphQLError, graphql_value};
use super::*;
#[test]
fn test_serialization() {
type ServerMessage = super::ServerMessage<DefaultScalarValue>;
assert_eq!(
serde_json::to_string(&ServerMessage::ConnectionError {
payload: ConnectionErrorPayload {
message: "foo".into(),
},
})
.unwrap(),
r#"{"type":"connection_error","payload":{"message":"foo"}}"#,
);
assert_eq!(
serde_json::to_string(&ServerMessage::ConnectionAck).unwrap(),
r#"{"type":"connection_ack"}"#,
);
assert_eq!(
serde_json::to_string(&ServerMessage::Data {
id: "foo".into(),
payload: DataPayload {
data: graphql_value!(null),
errors: vec![],
},
})
.unwrap(),
r#"{"type":"data","id":"foo","payload":{"data":null}}"#,
);
assert_eq!(
serde_json::to_string(&ServerMessage::Error {
id: "foo".into(),
payload: GraphQLError::UnknownOperationName.into(),
})
.unwrap(),
r#"{"type":"error","id":"foo","payload":[{"message":"Unknown operation"}]}"#,
);
assert_eq!(
serde_json::to_string(&ServerMessage::Complete { id: "foo".into() }).unwrap(),
r#"{"type":"complete","id":"foo"}"#,
);
assert_eq!(
serde_json::to_string(&ServerMessage::ConnectionKeepAlive).unwrap(),
r#"{"type":"ka"}"#,
);
}
}