neis_client/types/
his_timetable.rs

1#![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 HisTimetableParams {
9    /// 시도교육청코드
10    pub ATPT_OFCDC_SC_CODE: String,
11    /// 행정표준코드
12    pub SD_SCHUL_CODE: String,
13    /// 학년도
14    pub AY: Option<String>,
15    /// 학기
16    pub SEM: Option<String>,
17    /// 시간표일자
18    pub ALL_TI_YMD: Option<String>,
19    /// 주야과정명
20    pub DGHT_CRSE_SC_NM: Option<String>,
21    /// 계열명
22    pub ORD_SC_NM: Option<String>,
23    /// 학과명
24    pub DDDEP_NM: Option<String>,
25    /// 학년
26    pub GRADE: Option<String>,
27    /// 강의실명
28    pub CLRM_NM: Option<String>,
29    /// 학급명
30    pub CLASS_NM: Option<String>,
31    /// 시간표시작일자
32    pub TI_FROM_YMD: Option<String>,
33    /// 시간표종료일자
34    pub TI_TO_YMD: Option<String>,
35}
36
37impl HisTimetableParams {
38    pub fn new(atpt_ofcdc_sc_code: &str, sd_schul_code: &str) -> Self {
39        Self {
40            ATPT_OFCDC_SC_CODE: atpt_ofcdc_sc_code.to_owned(),
41            SD_SCHUL_CODE: sd_schul_code.to_owned(),
42            AY: None,
43            SEM: None,
44            ALL_TI_YMD: None,
45            DGHT_CRSE_SC_NM: None,
46            ORD_SC_NM: None,
47            DDDEP_NM: None,
48            GRADE: None,
49            CLRM_NM: None,
50            CLASS_NM: None,
51            TI_FROM_YMD: None,
52            TI_TO_YMD: None,
53        }
54    }
55
56    pub fn ay(mut self, year: i32) -> Self {
57        self.AY = Some(year.to_string());
58        self
59    }
60    pub fn sem(mut self, sem: u8) -> Self {
61        self.SEM = Some(sem.to_string());
62        self
63    }
64    pub fn ymd(mut self, year: i32, month: u8, day: u8) -> Self {
65        self.ALL_TI_YMD = Some(format!("{:04}{:02}{:02}", year, month, day));
66        self
67    }
68    pub fn grade(mut self, grade: u8) -> Self {
69        self.GRADE = Some(grade.to_string());
70        self
71    }
72    pub fn from_ymd(mut self, year: i32, month: u8, day: u8) -> Self {
73        self.TI_FROM_YMD = Some(format!("{:04}{:02}{:02}", year, month, day));
74        self
75    }
76    pub fn to_ymd(mut self, year: i32, month: u8, day: u8) -> Self {
77        self.TI_TO_YMD = Some(format!("{:04}{:02}{:02}", year, month, day));
78        self
79    }
80}
81
82impl ToQueryString for HisTimetableParams {
83    fn to_query_string(&self) -> String {
84        let mut serializer = Serializer::new(String::new());
85
86        serializer.append_pair("ATPT_OFCDC_SC_CODE", &self.ATPT_OFCDC_SC_CODE);
87        serializer.append_pair("SD_SCHUL_CODE", &self.SD_SCHUL_CODE);
88        if let Some(s) = &self.AY {
89            serializer.append_pair("AY", s);
90        }
91        if let Some(s) = &self.SEM {
92            serializer.append_pair("SEM", s);
93        }
94        if let Some(s) = &self.ALL_TI_YMD {
95            serializer.append_pair("ALL_TI_YMD", s);
96        }
97        if let Some(s) = &self.DGHT_CRSE_SC_NM {
98            serializer.append_pair("DGHT_CRSE_SC_NM", s);
99        }
100        if let Some(s) = &self.ORD_SC_NM {
101            serializer.append_pair("ORD_SC_NM", s);
102        }
103        if let Some(s) = &self.DDDEP_NM {
104            serializer.append_pair("DDDEP_NM", s);
105        }
106        if let Some(s) = &self.GRADE {
107            serializer.append_pair("GRADE", s);
108        }
109        if let Some(s) = &self.CLRM_NM {
110            serializer.append_pair("CLRM_NM", s);
111        }
112        if let Some(s) = &self.CLASS_NM {
113            serializer.append_pair("CLASS_NM", s);
114        }
115        if let Some(s) = &self.TI_FROM_YMD {
116            serializer.append_pair("TI_FROM_YMD", s);
117        }
118        if let Some(s) = &self.TI_TO_YMD {
119            serializer.append_pair("TI_TO_YMD", s);
120        }
121
122        serializer.finish()
123    }
124}
125
126#[derive(Debug, Clone, Deserialize, Hash)]
127pub struct HisTimetableItem {
128    /// 시도교육청코드
129    /// B10 | C10 | D10 | E10 | F10 | G10 | H10 | I10 | J10 | K10 | M10 | N10 | P10 | Q10 | R10 | S10 | T10 | V10
130    pub ATPT_OFCDC_SC_CODE: String,
131
132    /// 시도교육청명
133    /// Example: 서울특별시교육청
134    pub ATPT_OFCDC_SC_NM: String,
135
136    /// 행정표준코드
137    /// Example: 7010959
138    pub SD_SCHUL_CODE: String,
139
140    /// 학교명
141    /// Example: 문현고등학교
142    pub SCHUL_NM: String,
143
144    /// 학년도
145    /// Example: 2023
146    #[serde(deserialize_with = "deserialize_i32_from_string")]
147    pub AY: i32,
148
149    /// 학기
150    /// Example: 2
151    #[serde(deserialize_with = "deserialize_u8_from_string")]
152    pub SEM: u8,
153
154    /// 시간표일자
155    /// Example: 20230821
156    pub ALL_TI_YMD: String,
157
158    /// 주야과정명
159    /// Example: 주간
160    pub DGHT_CRSE_SC_NM: Option<String>,
161
162    /// 계열명
163    /// Example: 일반계
164    pub ORD_SC_NM: Option<String>,
165
166    /// 학과명
167    /// Example: 일반학과
168    pub DDDEP_NM: Option<String>,
169
170    /// 학년
171    /// Example: 3
172    #[serde(deserialize_with = "deserialize_u8_from_string")]
173    pub GRADE: u8,
174
175    /// 강의실명
176    /// Example: 301
177    pub CLRM_NM: Option<String>,
178
179    /// 학급명
180    /// Example: 1
181    pub CLASS_NM: Option<String>,
182
183    /// 교시
184    /// Example: 5
185    #[serde(deserialize_with = "deserialize_u8_from_string")]
186    pub PERIO: u8,
187
188    /// 수업내용
189    /// Example: [보강]음악 감상과 비평
190    pub ITRT_CNTNT: Option<String>,
191
192    /// 수정일자
193    /// Example: 20230827
194    pub LOAD_DTM: String,
195}