1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use crate::{
    get, post, put,
    response::{CollectionResponse, ResourceResponse},
    wanikani_client::WanikaniClient,
    wanikani_client::QP,
};
use chrono::{DateTime, Utc};
use reqwest::Error;
use serde::{Deserialize, Serialize};
use wanikani_rs_model::{study_material::StudyMaterial, subject_type::SubjectType};

#[derive(Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum StudyMaterialFilter {
    Hidden(bool),
    Ids(Vec<i64>),
    SubjectIds(Vec<i64>),
    SubjectTypes(Vec<SubjectType>),
    UpdatedAfter(DateTime<Utc>),
}

#[derive(Serialize, Deserialize)]
pub struct StudyMaterialCreate {
    pub subjet_id: i64,
    pub meaning_note: Option<String>,
    pub reading_note: Option<String>,
    pub meaning_synonyms: Option<Vec<String>>,
}

#[derive(Serialize, Deserialize)]
pub struct StudyMaterialUpdate {
    pub meaning_note: Option<String>,
    pub reading_note: Option<String>,
    pub meaning_synonyms: Option<Vec<String>>,
}

impl WanikaniClient {
    get!(
        get_study_materials_filtered,
        "study_materials",
        StudyMaterialFilter,
        CollectionResponse<ResourceResponse<StudyMaterial>>
    );
    get!(
        get_study_materials,
        "study_materials",
        CollectionResponse<ResourceResponse<StudyMaterial>>
    );
    get!(
        get_study_material,
        "study_materials/{id}",
        ResourceResponse<StudyMaterial>,
        id: i64
    );
    post!(
        create_study_material,
        "study_materials/",
        StudyMaterialCreate,
        ResourceResponse<StudyMaterial>
    );
    put!(
        update_study_material,
        "study_materials/{id}",
        StudyMaterialUpdate,
        ResourceResponse<StudyMaterial>,
        id: i64
    );
}