Skip to main content

schul_cloud_api/requests/
mod.rs

1use 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}