schul_cloud_api/requests/
mod.rs1use serde::Serialize;
2use serde::de::{DeserializeOwned, IntoDeserializer};
3use crate::state::State;
4use crate::errors::{Errors, Result};
5use crate::request_types::APIResponse;
6
7pub mod login;
8pub mod about;
9pub mod chats;
10#[cfg(feature = "blocking")]
11pub mod blocking;
12
13pub async fn post_request<T: DeserializeOwned>(state: &State, path: impl ToString, data: impl Serialize) -> Result<T> {
14 let url = state.build_url(path);
15 let response = reqwest::Client::new()
16 .post(url)
17 .form(&data)
18 .header("Accept", "application/json")
19 .header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:133.0) Gecko/20100101 Firefox/133.0")
20 .send().await?
21 .json::<APIResponse>().await.map_err(|e| Errors::NotJsonError(e))?;
22 if response.status.value != "OK" {
23 return Err(Errors::APIError(response.status.value, response.status.short_message, response.status.message))
24 }
25 T::deserialize(response.payload.clone().into_deserializer())
26 .map_err(|e| {
27 println!("{}", response.payload);
28 Errors::JsonDeserializeError(e)
29 })
30}