Skip to main content

neis_client/types/
sps_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 SpsTimetableParams {
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 SCHUL_CRSE_SC_NM: Option<String>,
21    /// 학년
22    pub GRADE: Option<String>,
23    /// 강의실명
24    pub CLRM_NM: Option<String>,
25    /// 학급명
26    pub CLASS_NM: Option<String>,
27    /// 교시
28    pub PERIO: Option<String>,
29    /// 시간표시작일자
30    pub TI_FROM_YMD: Option<String>,
31    /// 시간표종료일자
32    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    /// 시도교육청코드
127    /// B10 | C10 | D10 | E10 | F10 | G10 | H10 | I10 | J10 | K10 | M10 | N10 | P10 | Q10 | R10 | S10 | T10 | V10
128    pub ATPT_OFCDC_SC_CODE: String,
129
130    /// 시도교육청명
131    /// Example: 서울특별시교육청
132    pub ATPT_OFCDC_SC_NM: String,
133
134    /// 행정표준코드
135    /// Example: 7010575
136    pub SD_SCHUL_CODE: String,
137
138    /// 학교명
139    /// Example: 교남학교
140    pub SCHUL_NM: String,
141
142    /// 학년도
143    /// Example: 2023
144    #[serde(deserialize_with = "deserialize_i32_from_string")]
145    pub AY: i32,
146
147    /// 학기
148    /// Example: 2
149    #[serde(deserialize_with = "deserialize_u8_from_string")]
150    pub SEM: u8,
151
152    /// 시간표일자
153    /// Example: 20230822
154    pub ALL_TI_YMD: String,
155
156    /// 학교과정명
157    /// Example: 고등학교
158    pub SCHUL_CRSE_SC_NM: Option<String>,
159
160    /// 학년
161    /// Example: 3
162    #[serde(deserialize_with = "deserialize_u8_from_string")]
163    pub GRADE: u8,
164
165    /// 강의실명
166    /// Example: 1
167    pub CLRM_NM: Option<String>,
168
169    /// 학급명
170    /// Example: 1
171    pub CLASS_NM: Option<String>,
172
173    /// 교시
174    /// Example: 5
175    #[serde(deserialize_with = "deserialize_u8_from_string")]
176    pub PERIO: u8,
177
178    /// 수업내용
179    /// Example: [기]진로와 직업
180    pub ITRT_CNTNT: Option<String>,
181
182    /// 수정일자
183    /// Example: 20230827
184    pub LOAD_DTM: String,
185}