rsmycqu 0.4.4

A Rust library for interacting with Chonqing University services, including SSO authentication, campus card management, and more.
Documentation
use reqwest::{RequestBuilder, Response, StatusCode};
use serde_json::{Map, Value};
use snafu::ensure;

use crate::{
    errors,
    errors::{ApiError, mycqu::MyCQUResult},
    session::{Client, Session},
};

pub(super) mod access;
pub(super) mod encrypt;

pub(super) async fn mycqu_request_handler<T>(
    client: &Client,
    session: &Session,
    f: T,
) -> MyCQUResult<Response>
where
    T: FnOnce(&Client) -> RequestBuilder,
{
    let access_info = if let Some(access_info) = session.access_infos.mycqu_access_info.as_ref() {
        access_info
    } else {
        return Err(ApiError::NotAccess);
    };

    let res = session
        .execute(f(client).bearer_auth(access_info.auth_header.as_str()))
        .await?;

    if res.status() == StatusCode::UNAUTHORIZED {
        return Err(ApiError::NotAccess);
    }
    Ok(res)
}

/// 检查响应json的status字段是否为error,如果是则返回错误
pub(super) fn check_website_response(res: &Map<String, Value>) -> MyCQUResult<()> {
    ensure!(
        res.get("status")
            .and_then(Value::as_str)
            .is_some_and(|status| status == "success"),
        errors::WebsiteSnafu {
            msg: res
                .get("msg")
                .and_then(Value::as_str)
                .map(ToString::to_string)
                .unwrap_or("".to_string())
        }
    );

    Ok(())
}