threexui-rs 2.9.5

Async Rust SDK for the 3x-ui panel API (compatible with 3x-ui v2.9.2 and v2.9.3)
Documentation
use serde::Deserialize;

#[derive(Debug, Deserialize)]
pub(crate) struct ApiResponse<T> {
    pub success: bool,
    pub msg: String,
    pub obj: Option<T>,
}

impl<T> ApiResponse<T> {
    pub fn into_result(self) -> crate::Result<Option<T>> {
        if self.success {
            Ok(self.obj)
        } else {
            Err(crate::Error::Api(self.msg))
        }
    }
}

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

    #[test]
    fn success_response_ok() {
        let raw = r#"{"success":true,"msg":"","obj":42}"#;
        let resp: ApiResponse<i32> = serde_json::from_str(raw).unwrap();
        assert_eq!(resp.into_result().unwrap(), Some(42));
    }

    #[test]
    fn failed_response_is_err() {
        let raw = r#"{"success":false,"msg":"bad input","obj":null}"#;
        let resp: ApiResponse<i32> = serde_json::from_str(raw).unwrap();
        let err = resp.into_result().unwrap_err();
        assert!(err.to_string().contains("bad input"));
    }
}