neis_client/types/
class_info.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 ClassInfoParams {
9    /// 시도교육청코드
10    pub ATPT_OFCDC_SC_CODE: String,
11    /// 행정표준코드
12    pub SD_SCHUL_CODE: String,
13    /// 학년도
14    pub AY: Option<String>,
15    /// 학년
16    pub GRADE: Option<String>,
17    /// 주야과정명
18    pub DGHT_CRSE_SC_NM: Option<String>,
19    /// 학교과정명
20    pub SCHUL_CRSE_SC_NM: Option<String>,
21    /// 계열명
22    pub ORD_SC_NM: Option<String>,
23    /// 학과명
24    pub DDDEP_NM: Option<String>,
25}
26
27impl ClassInfoParams {
28    pub fn new(atpt_ofcdc_sc_code: &str, sd_schul_code: &str) -> Self {
29        Self {
30            ATPT_OFCDC_SC_CODE: atpt_ofcdc_sc_code.to_owned(),
31            SD_SCHUL_CODE: sd_schul_code.to_owned(),
32            AY: None,
33            GRADE: None,
34            DGHT_CRSE_SC_NM: None,
35            SCHUL_CRSE_SC_NM: None,
36            ORD_SC_NM: None,
37            DDDEP_NM: None,
38        }
39    }
40
41    pub fn ay(mut self, year: i32) -> Self {
42        self.AY = Some(year.to_string());
43        self
44    }
45    pub fn grade(mut self, grade: u8) -> Self {
46        self.GRADE = Some(grade.to_string());
47        self
48    }
49}
50
51impl ToQueryString for ClassInfoParams {
52    fn to_query_string(&self) -> String {
53        let mut serializer = Serializer::new(String::new());
54
55        serializer.append_pair("ATPT_OFCDC_SC_CODE", &self.ATPT_OFCDC_SC_CODE);
56        serializer.append_pair("SD_SCHUL_CODE", &self.SD_SCHUL_CODE);
57        if let Some(s) = &self.AY {
58            serializer.append_pair("AY", s);
59        }
60        if let Some(s) = &self.GRADE {
61            serializer.append_pair("GRADE", s);
62        }
63        if let Some(s) = &self.DGHT_CRSE_SC_NM {
64            serializer.append_pair("DGHT_CRSE_SC_NM", s);
65        }
66        if let Some(s) = &self.SCHUL_CRSE_SC_NM {
67            serializer.append_pair("SCHUL_CRSE_SC_NM", s);
68        }
69        if let Some(s) = &self.ORD_SC_NM {
70            serializer.append_pair("ORD_SC_NM", s);
71        }
72        if let Some(s) = &self.DDDEP_NM {
73            serializer.append_pair("DDDEP_NM", s);
74        }
75
76        serializer.finish()
77    }
78}
79
80#[derive(Debug, Clone, Deserialize, Hash)]
81pub struct ClassInfoItem {
82    /// 시도교육청코드
83    /// B10 | C10 | D10 | E10 | F10 | G10 | H10 | I10 | J10 | K10 | M10 | N10 | P10 | Q10 | R10 | S10 | T10 | V10
84    pub ATPT_OFCDC_SC_CODE: String,
85
86    /// 시도교육청명
87    /// Example: 서울특별시교육청
88    pub ATPT_OFCDC_SC_NM: String,
89
90    /// 행정표준코드
91    /// Example: 7010959
92    pub SD_SCHUL_CODE: String,
93
94    /// 학교명
95    /// Example: 문현고등학교
96    pub SCHUL_NM: String,
97
98    /// 학년도
99    /// Example: 2024
100    #[serde(deserialize_with = "deserialize_i32_from_string")]
101    pub AY: i32,
102
103    /// 학년
104    /// Example: 1
105    #[serde(deserialize_with = "deserialize_u8_from_string")]
106    pub GRADE: u8,
107
108    /// 주야과정명
109    /// Example: 주간
110    pub DGHT_CRSE_SC_NM: Option<String>,
111
112    /// 학교과정명
113    /// Example: 고등학교
114    pub SCHUL_CRSE_SC_NM: Option<String>,
115
116    /// 계열명
117    /// Example: 일반계
118    pub ORD_SC_NM: Option<String>,
119
120    /// 학과명
121    /// Example: 일반학과
122    pub DDDEP_NM: Option<String>,
123
124    /// 학급명
125    /// Example: 5
126    pub CLASS_NM: Option<String>,
127
128    /// 수정일자
129    /// Example: 20250901
130    pub LOAD_DTM: String,
131}