neis_client/types/
sps_timetable.rs1#![allow(non_snake_case)]
2use super::ToQueryString;
3use super::{deserialize_i32_from_string, deserialize_u8_from_string};
4use form_urlencoded::Serializer;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize)]
8pub struct SpsTimetableParams {
9 pub ATPT_OFCDC_SC_CODE: String,
11 pub SD_SCHUL_CODE: String,
13 pub AY: Option<String>,
15 pub SEM: Option<String>,
17 pub ALL_TI_YMD: Option<String>,
19 pub SCHUL_CRSE_SC_NM: Option<String>,
21 pub GRADE: Option<String>,
23 pub CLRM_NM: Option<String>,
25 pub CLASS_NM: Option<String>,
27 pub PERIO: Option<String>,
29 pub TI_FROM_YMD: Option<String>,
31 pub TI_TO_YMD: Option<String>,
33}
34
35impl SpsTimetableParams {
36 pub fn new(atpt_ofcdc_sc_code: &str, sd_schul_code: &str) -> Self {
37 Self {
38 ATPT_OFCDC_SC_CODE: atpt_ofcdc_sc_code.to_owned(),
39 SD_SCHUL_CODE: sd_schul_code.to_owned(),
40 AY: None,
41 SEM: None,
42 ALL_TI_YMD: None,
43 SCHUL_CRSE_SC_NM: None,
44 GRADE: None,
45 CLRM_NM: None,
46 CLASS_NM: None,
47 PERIO: None,
48 TI_FROM_YMD: None,
49 TI_TO_YMD: None,
50 }
51 }
52
53 pub fn ay(mut self, year: i32) -> Self {
54 self.AY = Some(year.to_string());
55 self
56 }
57 pub fn sem(mut self, sem: u8) -> Self {
58 self.SEM = Some(sem.to_string());
59 self
60 }
61 pub fn ymd(mut self, year: i32, month: u8, day: u8) -> Self {
62 self.ALL_TI_YMD = Some(format!("{:04}{:02}{:02}", year, month, day));
63 self
64 }
65 pub fn grade(mut self, grade: u8) -> Self {
66 self.GRADE = Some(grade.to_string());
67 self
68 }
69 pub fn perio(mut self, perio: u8) -> Self {
70 self.PERIO = Some(perio.to_string());
71 self
72 }
73 pub fn from_ymd(mut self, year: i32, month: u8, day: u8) -> Self {
74 self.TI_FROM_YMD = Some(format!("{:04}{:02}{:02}", year, month, day));
75 self
76 }
77 pub fn to_ymd(mut self, year: i32, month: u8, day: u8) -> Self {
78 self.TI_TO_YMD = Some(format!("{:04}{:02}{:02}", year, month, day));
79 self
80 }
81}
82
83impl ToQueryString for SpsTimetableParams {
84 fn to_query_string(&self) -> String {
85 let mut serializer = Serializer::new(String::new());
86
87 serializer.append_pair("ATPT_OFCDC_SC_CODE", &self.ATPT_OFCDC_SC_CODE);
88 serializer.append_pair("SD_SCHUL_CODE", &self.SD_SCHUL_CODE);
89 if let Some(s) = &self.AY {
90 serializer.append_pair("AY", s);
91 }
92 if let Some(s) = &self.SEM {
93 serializer.append_pair("SEM", s);
94 }
95 if let Some(s) = &self.ALL_TI_YMD {
96 serializer.append_pair("ALL_TI_YMD", s);
97 }
98 if let Some(s) = &self.SCHUL_CRSE_SC_NM {
99 serializer.append_pair("SCHUL_CRSE_SC_NM", s);
100 }
101 if let Some(s) = &self.GRADE {
102 serializer.append_pair("GRADE", s);
103 }
104 if let Some(s) = &self.CLRM_NM {
105 serializer.append_pair("CLRM_NM", s);
106 }
107 if let Some(s) = &self.CLASS_NM {
108 serializer.append_pair("CLASS_NM", s);
109 }
110 if let Some(s) = &self.PERIO {
111 serializer.append_pair("PERIO", s);
112 }
113 if let Some(s) = &self.TI_FROM_YMD {
114 serializer.append_pair("TI_FROM_YMD", s);
115 }
116 if let Some(s) = &self.TI_TO_YMD {
117 serializer.append_pair("TI_TO_YMD", s);
118 }
119
120 serializer.finish()
121 }
122}
123
124#[derive(Debug, Clone, Deserialize, Hash)]
125pub struct SpsTimetableItem {
126 pub ATPT_OFCDC_SC_CODE: String,
129
130 pub ATPT_OFCDC_SC_NM: String,
133
134 pub SD_SCHUL_CODE: String,
137
138 pub SCHUL_NM: String,
141
142 #[serde(deserialize_with = "deserialize_i32_from_string")]
145 pub AY: i32,
146
147 #[serde(deserialize_with = "deserialize_u8_from_string")]
150 pub SEM: u8,
151
152 pub ALL_TI_YMD: String,
155
156 pub SCHUL_CRSE_SC_NM: Option<String>,
159
160 #[serde(deserialize_with = "deserialize_u8_from_string")]
163 pub GRADE: u8,
164
165 pub CLRM_NM: Option<String>,
168
169 pub CLASS_NM: Option<String>,
172
173 #[serde(deserialize_with = "deserialize_u8_from_string")]
176 pub PERIO: u8,
177
178 pub ITRT_CNTNT: Option<String>,
181
182 pub LOAD_DTM: String,
185}