Skip to main content

neis_client/types/
school_schedule.rs

1#![allow(non_snake_case)]
2use super::ToQueryString;
3use super::deserialize_i32_from_string;
4use form_urlencoded::Serializer;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize)]
8pub struct SchoolScheduleParams {
9    /// 시도교육청코드
10    pub ATPT_OFCDC_SC_CODE: String,
11    /// 행정표준코드
12    pub SD_SCHUL_CODE: String,
13    /// 주야과정명
14    pub DGHT_CRSE_SC_NM: Option<String>,
15    /// 학교과정명
16    pub SCHUL_CRSE_SC_NM: Option<String>,
17    /// 학사일자
18    pub AA_YMD: Option<String>,
19    /// 학사시작일자
20    pub AA_FROM_YMD: Option<String>,
21    /// 학사종료일자
22    pub AA_TO_YMD: Option<String>,
23}
24
25impl SchoolScheduleParams {
26    pub fn new(atpt_ofcdc_sc_code: &str, sd_schul_code: &str) -> Self {
27        Self {
28            ATPT_OFCDC_SC_CODE: atpt_ofcdc_sc_code.to_owned(),
29            SD_SCHUL_CODE: sd_schul_code.to_owned(),
30            DGHT_CRSE_SC_NM: None,
31            SCHUL_CRSE_SC_NM: None,
32            AA_YMD: None,
33            AA_FROM_YMD: None,
34            AA_TO_YMD: None,
35        }
36    }
37
38    pub fn ymd(mut self, year: i32, month: u8, day: u8) -> Self {
39        self.AA_YMD = Some(format!("{:04}{:02}{:02}", year, month, day));
40        self
41    }
42    pub fn from_ymd(mut self, year: i32, month: u8, day: u8) -> Self {
43        self.AA_FROM_YMD = Some(format!("{:04}{:02}{:02}", year, month, day));
44        self
45    }
46    pub fn to_ymd(mut self, year: i32, month: u8, day: u8) -> Self {
47        self.AA_TO_YMD = Some(format!("{:04}{:02}{:02}", year, month, day));
48        self
49    }
50}
51
52impl ToQueryString for SchoolScheduleParams {
53    fn to_query_string(&self) -> String {
54        let mut serializer = Serializer::new(String::new());
55
56        serializer.append_pair("ATPT_OFCDC_SC_CODE", &self.ATPT_OFCDC_SC_CODE);
57        serializer.append_pair("SD_SCHUL_CODE", &self.SD_SCHUL_CODE);
58        if let Some(s) = &self.DGHT_CRSE_SC_NM {
59            serializer.append_pair("DGHT_CRSE_SC_NM", s);
60        }
61        if let Some(s) = &self.SCHUL_CRSE_SC_NM {
62            serializer.append_pair("SCHUL_CRSE_SC_NM", s);
63        }
64        if let Some(s) = &self.AA_YMD {
65            serializer.append_pair("AA_YMD", s);
66        }
67        if let Some(s) = &self.AA_FROM_YMD {
68            serializer.append_pair("AA_FROM_YMD", s);
69        }
70        if let Some(s) = &self.AA_TO_YMD {
71            serializer.append_pair("AA_TO_YMD", s);
72        }
73
74        serializer.finish()
75    }
76}
77
78#[derive(Debug, Clone, Deserialize, Hash)]
79pub struct SchoolScheduleItem {
80    /// 시도교육청코드
81    /// B10 | C10 | D10 | E10 | F10 | G10 | H10 | I10 | J10 | K10 | M10 | N10 | P10 | Q10 | R10 | S10 | T10 | V10
82    pub ATPT_OFCDC_SC_CODE: String,
83
84    /// 시도교육청명
85    /// Example: 서울특별시교육청
86    pub ATPT_OFCDC_SC_NM: String,
87
88    /// 행정표준코드
89    /// Example: 7010959
90    pub SD_SCHUL_CODE: String,
91
92    /// 학교명
93    /// Example: 문현고등학교
94    pub SCHUL_NM: String,
95
96    /// 학년도
97    /// Example: 2024
98    #[serde(deserialize_with = "deserialize_i32_from_string")]
99    pub AY: i32,
100
101    /// 주야과정명
102    /// Example: 주간
103    pub DGHT_CRSE_SC_NM: Option<String>,
104
105    /// 학교과정명
106    /// Example: 고등학교
107    pub SCHUL_CRSE_SC_NM: Option<String>,
108
109    /// 수업공제일명
110    /// Example: 휴업일
111    pub SBTR_DD_SC_NM: Option<String>,
112
113    /// 학사일자
114    /// Example: 20240309
115    pub AA_YMD: String,
116
117    /// 행사명
118    /// Example: 토요휴업일
119    pub EVENT_NM: String,
120
121    /// 행사내용
122    /// Example:
123    pub EVENT_CNTNT: String,
124
125    /// 1학년행사여부
126    /// Y | N
127    pub ONE_GRADE_EVENT_YN: String,
128    /// 2학년행사여부
129    /// Y | N
130    pub TW_GRADE_EVENT_YN: String,
131    /// 3학년행사여부
132    /// Y | N
133    pub THREE_GRADE_EVENT_YN: String,
134    /// 4학년행사여부
135    /// Y | N | *
136    pub FR_GRADE_EVENT_YN: String,
137    /// 5학년행사여부
138    /// Y | N | *
139    pub FIV_GRADE_EVENT_YN: String,
140    /// 6학년행사여부
141    /// Y | N | *
142    pub SIX_GRADE_EVENT_YN: String,
143
144    /// 수정일자
145    /// Example: 20250930
146    pub LOAD_DTM: String,
147}
148
149impl SchoolScheduleItem {
150    pub fn is_event_for_grade(&self, grade: u8) -> bool {
151        match grade {
152            1 => self.ONE_GRADE_EVENT_YN == "Y",
153            2 => self.TW_GRADE_EVENT_YN == "Y",
154            3 => self.THREE_GRADE_EVENT_YN == "Y",
155            4 => self.FR_GRADE_EVENT_YN == "Y",
156            5 => self.FIV_GRADE_EVENT_YN == "Y",
157            6 => self.SIX_GRADE_EVENT_YN == "Y",
158            _ => false,
159        }
160    }
161}