lark-channel 0.4.0

Lark/Feishu Channel SDK for Rust
Documentation
use serde::de::DeserializeOwned;
use serde_json::Value;

use crate::{Error, Result};

use super::HttpResponse;

pub(super) fn parse_openapi_response<R>(response: HttpResponse) -> Result<R>
where
    R: DeserializeOwned,
{
    if !(200..300).contains(&response.status) {
        return Err(Error::HttpStatus {
            status: response.status,
        });
    }

    if let Some(code) = response.body.get("code").and_then(Value::as_i64) {
        if code != 0 {
            let message = response
                .body
                .get("msg")
                .or_else(|| response.body.get("message"))
                .and_then(Value::as_str)
                .unwrap_or_default()
                .to_owned();
            return Err(Error::Api { code, message });
        }
    }

    serde_json::from_value(response.body).map_err(Error::from)
}