neis_client/client/
response.rs

1#![allow(dead_code)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4use crate::types::{
5    ClassInfoItem, ClassRoomInfoItem, ElsTimetableItem, HisTimetableItem, MealServiceItem,
6    MisTimetableItem, SchoolAflcoInfoItem, SchoolInfoItem, SchoolMajorInfoItem, SchoolScheduleItem,
7    SpsTimetableItem,
8};
9use serde::Deserialize;
10
11use super::AcademyInfoItem;
12
13#[derive(Debug, Deserialize)]
14pub struct ResultCode {
15    CODE: String,
16    MESSAGE: String,
17}
18
19#[derive(Debug, Deserialize)]
20struct HeadFirst {
21    list_total_count: usize,
22}
23
24#[derive(Debug, Deserialize)]
25struct HeadSecond {
26    RESULT: ResultCode,
27}
28
29#[derive(Debug, Deserialize)]
30pub struct ResultHead {
31    head: (HeadFirst, HeadSecond), // 배열
32}
33
34impl ResultHead {
35    pub fn get_total_count(&self) -> usize {
36        self.head.0.list_total_count
37    }
38}
39
40#[derive(Debug, Deserialize)]
41pub struct ResultBody<T> {
42    pub row: Vec<T>,
43}
44
45#[derive(Debug, Deserialize)]
46pub enum ResponseBody {
47    #[serde(rename = "RESULT")]
48    Result(ResultCode),
49    schoolInfo((ResultHead, ResultBody<SchoolInfoItem>)), // 배열
50    classInfo((ResultHead, ResultBody<ClassInfoItem>)),   // 배열
51    schoolMajorinfo((ResultHead, ResultBody<SchoolMajorInfoItem>)), // 배열
52    schulAflcoinfo((ResultHead, ResultBody<SchoolAflcoInfoItem>)), // 배열
53    SchoolSchedule((ResultHead, ResultBody<SchoolScheduleItem>)), // 배열
54    elsTimetable((ResultHead, ResultBody<ElsTimetableItem>)), // 배열
55    misTimetable((ResultHead, ResultBody<MisTimetableItem>)), // 배열
56    hisTimetable((ResultHead, ResultBody<HisTimetableItem>)), // 배열
57    spsTimetable((ResultHead, ResultBody<SpsTimetableItem>)), // 배열
58    tiClrminfo((ResultHead, ResultBody<ClassRoomInfoItem>)), // 배열
59    acaInsTiInfo((ResultHead, ResultBody<AcademyInfoItem>)), // 배열
60    mealServiceDietInfo((ResultHead, ResultBody<MealServiceItem>)), // 배열
61}
62
63pub trait ExtractFromResponse {
64    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>)
65    where
66        Self: Sized;
67}
68
69impl ExtractFromResponse for SchoolInfoItem {
70    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
71        if let ResponseBody::schoolInfo((head, data)) = response {
72            (head.get_total_count(), data.row)
73        } else {
74            Default::default()
75        }
76    }
77}
78
79impl ExtractFromResponse for ClassInfoItem {
80    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
81        if let ResponseBody::classInfo((head, data)) = response {
82            (head.get_total_count(), data.row)
83        } else {
84            Default::default()
85        }
86    }
87}
88
89impl ExtractFromResponse for SchoolMajorInfoItem {
90    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
91        if let ResponseBody::schoolMajorinfo((head, data)) = response {
92            (head.get_total_count(), data.row)
93        } else {
94            Default::default()
95        }
96    }
97}
98
99impl ExtractFromResponse for SchoolAflcoInfoItem {
100    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
101        if let ResponseBody::schulAflcoinfo((head, data)) = response {
102            (head.get_total_count(), data.row)
103        } else {
104            Default::default()
105        }
106    }
107}
108
109impl ExtractFromResponse for SchoolScheduleItem {
110    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
111        if let ResponseBody::SchoolSchedule((head, data)) = response {
112            (head.get_total_count(), data.row)
113        } else {
114            Default::default()
115        }
116    }
117}
118
119impl ExtractFromResponse for ElsTimetableItem {
120    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
121        if let ResponseBody::elsTimetable((head, data)) = response {
122            (head.get_total_count(), data.row)
123        } else {
124            Default::default()
125        }
126    }
127}
128
129impl ExtractFromResponse for MisTimetableItem {
130    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
131        if let ResponseBody::misTimetable((head, data)) = response {
132            (head.get_total_count(), data.row)
133        } else {
134            Default::default()
135        }
136    }
137}
138
139impl ExtractFromResponse for HisTimetableItem {
140    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
141        if let ResponseBody::hisTimetable((head, data)) = response {
142            (head.get_total_count(), data.row)
143        } else {
144            Default::default()
145        }
146    }
147}
148
149impl ExtractFromResponse for SpsTimetableItem {
150    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
151        if let ResponseBody::spsTimetable((head, data)) = response {
152            (head.get_total_count(), data.row)
153        } else {
154            Default::default()
155        }
156    }
157}
158
159impl ExtractFromResponse for ClassRoomInfoItem {
160    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
161        if let ResponseBody::tiClrminfo((head, data)) = response {
162            (head.get_total_count(), data.row)
163        } else {
164            Default::default()
165        }
166    }
167}
168
169impl ExtractFromResponse for AcademyInfoItem {
170    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
171        if let ResponseBody::acaInsTiInfo((head, data)) = response {
172            (head.get_total_count(), data.row)
173        } else {
174            Default::default()
175        }
176    }
177}
178
179impl ExtractFromResponse for MealServiceItem {
180    fn extract_from_response(response: ResponseBody) -> (usize, Vec<Self>) {
181        if let ResponseBody::mealServiceDietInfo((head, data)) = response {
182            (head.get_total_count(), data.row)
183        } else {
184            Default::default()
185        }
186    }
187}