1use serde::{Deserialize, Serialize};
2
3use crate::{
4 Client,
5 course::{Course, Jxb},
6 error::{Error, R},
7};
8
9impl Client {
10 pub async fn fetch_courses(&self, q: &str) -> R<Course> {
12 #[derive(Serialize, Debug)]
13 struct PartDisplayRequestData<'a> {
14 #[serde(rename = "filter_list[0]")]
15 filter_list: &'a str,
16 xbm: &'a str,
17 ccdm: &'a str,
18 kklxdm: &'a str,
19 xkxnm: &'a str, xkxqm: &'a str, jg_id: &'a str, xsbj: &'a str, mzm: &'a str,
24 xz: &'a str, bh_id: &'a str, xqh_id: &'a str, zyfx_id: &'a str, xslbdm: &'a str,
29 kspage: &'a str,
30 jspage: &'a str,
31 }
32
33 let part_display_data = PartDisplayRequestData {
34 filter_list: q.into(),
35 xbm: self.use_store("xbm"),
36 ccdm: self.use_store("ccdm"),
37 kklxdm: self.use_store("firstKklxdm"),
38 xkxnm: self.use_store("xkxnm"),
39 xkxqm: self.use_store("xkxqm"),
40 jg_id: self.use_store("jg_id_1"),
41 xsbj: self.use_store("xsbj"),
42 mzm: self.use_store("mzm"),
43 xz: self.use_store("xz"),
44 bh_id: self.use_store("bh_id"),
45 xqh_id: self.use_store("xqh_id"),
46 zyfx_id: self.use_store("zyfx_id"),
47 xslbdm: self.use_store("xslbdm"),
48 kspage: "1",
49 jspage: "10",
50 };
51
52 #[derive(Deserialize, Debug)]
53 struct PartDisplayResponseData {
54 #[serde(rename = "tmpList")]
55 tmp_list: Vec<PartDisplayResponseInnerData>,
56 }
57
58 impl PartDisplayResponseData {
59 fn use_first_kch_id(&self) -> R<&String> {
60 Ok(&self
61 .tmp_list
62 .get(0)
63 .ok_or(Error::JxbNotFound("~.tmp_list.0"))?
64 .kch_id)
65 }
66 }
67
68 #[derive(Deserialize, Debug)]
69 struct PartDisplayResponseInnerData {
70 kch_id: String, }
75
76 let part_display_res = self
77 .post(&Client::SELECT_COURSE_PART_DISPLAY_URL)
78 .form(&part_display_data)
79 .send()
80 .await?
81 .json::<PartDisplayResponseData>()
82 .await?;
83
84 #[derive(Serialize, Debug)]
85 struct QueryDoWithCouresIdRequestData<'a> {
86 #[serde(rename = "filter_list[0]")]
87 filter_list: &'a str,
88 xkxqm: &'a str,
89 xkxnm: &'a str,
90 xkkz_id: &'a str,
91 bklx_id: &'a str,
92 kch_id: &'a str, njdm_id: &'a str, xsbj: &'a str,
95 xz: &'a str, mzm: &'a str,
97 kklxdm: &'a str,
98 bh_id: &'a str,
99 xqh_id: &'a str,
100 xslbdm: &'a str,
101 zyfx_id: &'a str,
102 jg_id: &'a str,
103 ccdm: &'a str,
104 xbm: &'a str,
105 }
106
107 let query_do_data = QueryDoWithCouresIdRequestData {
108 filter_list: q.into(),
109 xkxqm: self.use_store("xkxqm"),
110 xkxnm: self.use_store("xkxnm"),
111 xkkz_id: self.use_store("firstXkkzId"),
112 bklx_id: self.use_store("bklx_id"),
113 kch_id: &part_display_res.use_first_kch_id()?,
114 njdm_id: self.use_store("njdm_id"),
115 xsbj: self.use_store("xsbj"),
116 xz: self.use_store("xz"),
117 mzm: self.use_store("mzm"),
118 kklxdm: self.use_store("firstKklxdm"),
119 bh_id: self.use_store("bh_id"),
120 xqh_id: self.use_store("xqh_id"),
121 xslbdm: self.use_store("xslbdm"),
122 zyfx_id: self.use_store("zyfx_id"),
123 jg_id: self.use_store("jg_id_1"),
124 ccdm: self.use_store("ccdm"),
125 xbm: self.use_store("xbm"),
126 };
127
128 #[derive(Deserialize, Debug)]
130 struct SelectCourseQueryDoWithCourseIdResponseInnerData {
131 do_jxb_id: String, jsxx: String, jxb_id: String, sksj: String, }
139
140 let query_do_res = self
141 .post(&Client::SELECT_COURSE_QUERY_DO_WITH_COURSE_ID_URL)
142 .form(&query_do_data)
143 .send()
144 .await?
145 .json::<Vec<SelectCourseQueryDoWithCourseIdResponseInnerData>>()
146 .await?;
147
148 let mut returndta = Course {
149 xkkz_id: self
150 .stores
151 .get("firstXkkzId")
152 .ok_or(Error::Missing("[firstXkkzId] when fetch_courses".into()))?
153 .into(),
154
155 kch_id: part_display_res.use_first_kch_id()?.into(),
156 jxb: vec![],
157 };
158
159 for item in query_do_res {
160 returndta.jxb.push(Jxb {
161 jxb_id: item.jxb_id,
162 do_id: item.do_jxb_id,
163 jsxx: item.jsxx,
164 sksj: item.sksj,
165 });
166 }
167
168 Ok(returndta)
169 }
170}