use serde::Deserialize;
#[derive(Clone, Debug, Eq, PartialEq, Default, Deserialize)]
pub struct ApiResponse {
#[serde(rename = "status", skip_serializing_if = "Option::is_none")]
pub status: Option<ApiStatus>,
#[serde(rename = "message", skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
#[serde(rename = "data", skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
}
#[derive(Deserialize, PartialEq, Eq, Debug, Clone)]
#[serde(rename_all = "lowercase")]
pub enum ApiStatus {
Success,
Error,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn given_good_response_when_deserializing_status_then_return_struct() {
let string = r#"{ "status": "success", "data": { "test1": 42 } }"#;
let status: ApiResponse = serde_json::from_str(string).expect("Error with deserialization");
assert_eq!(
status,
ApiResponse {
status: Some(ApiStatus::Success),
message: None,
data: Some(json!({"test1": 42}))
}
);
}
#[test]
fn given_error_repsonse_when_deserializing_status_then_return_struct() {
let string =
r#"{ "status": "error", "message": "testing message", "data": { "test1": 42 } }"#;
let status: ApiResponse = serde_json::from_str(string).expect("Error with deserialization");
assert_eq!(
status,
ApiResponse {
status: Some(ApiStatus::Error),
message: Some("testing message".into()),
data: Some(json!({"test1": 42}))
}
);
}
#[test]
#[should_panic]
fn given_any_repsonse_when_deserializing_status_then_return_struct() {
let string = r#"{ "status": "any", "data": { }"#;
let status: ApiResponse = serde_json::from_str(string).expect("Error with deserialization");
assert_eq!(
status,
ApiResponse {
status: Some(ApiStatus::Error),
message: None,
data: Some(json!({}))
}
);
}
}