classcharts/api/
pupilfields.rs1use serde::Deserialize;
2
3use crate::client::{ErrorResponse, CCParser, SuccessResponse, Client};
4
5use super::helpers::Empty;
6
7#[derive(Deserialize, Debug)]
8pub struct PupilField {
9 pub id: usize,
10 pub name: String,
11 pub graphic: String,
12 pub value: String,
13}
14
15#[derive(Deserialize, Debug)]
16pub struct PupilFieldsData {
17 pub note: String,
18 pub fields: Vec<PupilField>,
19}
20
21pub type PupilFieldsMeta = Vec<Empty>;
22
23pub type PupilFields = SuccessResponse<PupilFieldsData, PupilFieldsMeta>;
24
25impl Client {
26 pub async fn get_pupilfields(&mut self) -> Result<PupilFields, ErrorResponse> {
28 let request = self
29 .build_get(format!("/customfields/{}", self.student_id))
30 .await?
31 .send()
32 .await?;
33
34 let text = request.cc_parse().await?;
35 let data: PupilFields = serde_json::from_str(&text)?;
36
37 return Ok(data);
38 }
39}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44 use httpmock::prelude::*;
45 use serde_json::json;
46
47 #[tokio::test]
48 async fn get_pupilfields_test() {
49 let server = MockServer::start();
51
52 let pupilfields_response = server.mock(|when, then| {
54 when.method(GET)
55 .path("/apiv2student/customfields/student_id");
56 then.status(200)
57 .header("content-type", "application/json")
58 .json_body(json!({
59 "success": 1,
60 "data": {
61 "note": "Note",
62 "fields": [
63 {
64 "id": 43583485,
65 "name": "Field Name",
66 "graphic": "#000",
67 "value": "Value",
68 }
69 ]
70 },
71 "meta": [],
72 }));
73 });
74
75 let mut client = Client::generate_mock(server.base_url());
76
77 let _ = client.get_pupilfields().await.unwrap();
78
79 pupilfields_response.assert();
80 }
81}