cloud_terrastodon_rest 0.36.0

In-process REST helpers and request objects for Cloud Terrastodon
use serde::Deserialize;
use serde::Serialize;
use serde_json::Value;

#[derive(Debug, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum RestResponseBody {
    Json(Value),
    Text(String),
}

pub fn parse_response_body(content: String) -> RestResponseBody {
    match serde_json::from_str::<Value>(&content) {
        Ok(value) => RestResponseBody::Json(value),
        Err(_) => RestResponseBody::Text(content),
    }
}

#[cfg(test)]
mod tests {
    use super::RestResponseBody;
    use super::parse_response_body;

    #[test]
    fn parses_json_response_body() {
        let body = parse_response_body("{\"hello\":\"world\"}".to_string());
        assert_eq!(
            body,
            RestResponseBody::Json(serde_json::json!({"hello": "world"}))
        );
    }

    #[test]
    fn preserves_text_response_body() {
        let body = parse_response_body("not json".to_string());
        assert_eq!(body, RestResponseBody::Text("not json".to_string()));
    }
}