Files
sdgb-utils-rs/sdgb-cli/src/utils/mod.rs

71 lines
1.7 KiB
Rust

use std::{fmt::Display, io::stdout};
use nyquest_preset::nyquest::AsyncClient;
use sdgb_api::{
ApiError,
title::{
MaiVersionExt as _, Sdgb1_53,
methods::APIMethod,
model::{UserLoginApi, UserLoginApiResp, UserLogoutApi, UserLogoutApiResp},
},
};
use serde::Serialize;
use spdlog::info;
pub async fn login_action<R>(
client: &AsyncClient,
user_id: u32,
token: Option<String>,
action: impl AsyncFnOnce(UserLoginApiResp) -> R,
) -> Result<R, ApiError> {
let login = UserLoginApi::new(user_id, true, token);
let login_date_time = login.date_time;
let login_resp: UserLoginApiResp =
Sdgb1_53::request(&client, APIMethod::UserLoginApi, user_id, login).await?;
match login_resp.error() {
None => info!("login succeed"),
Some(e) => return Err(e)?,
}
let return_data = action(login_resp).await;
let logout_resp = Sdgb1_53::request::<_, UserLogoutApiResp>(
&client,
APIMethod::UserLogoutApi,
user_id,
UserLogoutApi {
user_id,
login_date_time,
..Default::default()
},
)
.await;
info!("logout: {logout_resp:?}");
Ok(return_data)
}
pub fn json_display(value: impl Serialize) -> Result<(), Box<dyn snafu::Error>> {
let lock = stdout().lock();
serde_json::to_writer_pretty(lock, &value)?;
Ok(())
}
pub fn human_readable_display(
value: impl Display + Serialize,
human_readable: bool,
) -> Result<(), Box<dyn snafu::Error>> {
if human_readable {
println!("{value}");
} else {
json_display(value)?;
}
Ok(())
}
#[cfg(feature = "fetchall")]
pub mod helpers;