Skip to main content

comcigan_rs/
class.rs

1use std::{fmt::Display};
2
3use serde::{Serialize, Deserialize};
4
5#[derive(Serialize, Deserialize, Clone)]
6pub struct Grade {
7    pub grade_num: u8,
8    pub(crate) classes: Vec<Class>
9}
10
11impl Display for Grade {
12    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13        write!(f, "{} 학년", self.grade_num)
14    }
15}
16
17#[derive(Serialize, Deserialize, Clone)]
18pub struct Class {
19    pub class_num: u8,
20    pub(crate) days: Vec<Day>
21}
22
23impl Display for Class {
24    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25        write!(f, "{} 반", self.class_num)
26    }
27}
28
29#[derive(Serialize, Deserialize, Clone)]
30pub struct Day {
31    pub(crate) day_num: u8,
32    pub periods: Vec<Period>
33}
34
35impl Display for Day {
36    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37        let day_num = self.day_num % 7;
38        match day_num {
39            0 => write!(f, "월요일"),
40            1 => write!(f, "화요일"),
41            2 => write!(f, "수요일"),
42            3 => write!(f, "목요일"),
43            4 => write!(f, "금요일"),
44            5 => write!(f, "토요일"),
45            6 => write!(f, "일요일"),
46            _ => panic!("Invalid day number: {}", day_num)
47        }
48    }
49}
50
51
52#[derive(Serialize, Deserialize, Clone)]
53pub struct Period {
54    pub period_num: u8,
55    pub subject: String,
56    pub teacher: String
57}
58
59impl Display for Period {
60    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
61        write!(f, "{}교시\n선생님: {}\n과목: {}", self.period_num, self.teacher, self.subject)
62    }
63}
64
65#[derive(Serialize, Deserialize, Clone)]
66pub struct SchoolData {
67    pub name: String, 
68    pub(crate) grades: Vec<Grade>
69}
70
71impl Display for SchoolData {
72    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
73        write!(f, "{}", self.name)
74    }
75}
76
77impl SchoolData {
78    pub fn grade(&self, grade: usize) -> Grade {
79        self.grades[grade - 1].clone()
80    }
81
82    pub fn list_grades(&self) -> Vec<Grade> {
83        self.grades.clone()
84    }
85
86    pub fn new(name: &str) -> Self {
87        Self {
88            name: name.to_string(),
89            grades: vec![]
90        }
91    }
92}
93
94impl Grade {
95    pub fn class(&self, class: usize) -> Class {
96        self.classes[class - 1].clone()
97    }
98
99    pub fn list_classes(&self) -> Vec<Class> {
100        self.classes.clone()
101    }
102
103    pub fn new(grade_num: u8) -> Grade {
104        Grade {
105            grade_num,
106            classes: Vec::new()
107        }
108    }
109}
110
111impl Class {
112    pub fn day(&self, day: usize) -> Day {
113        self.days[day - 1].clone()
114    }
115
116    pub fn list_days(&self) -> Vec<Day> {
117        self.days.clone()
118    }
119
120    pub fn new(class_num: u8) -> Class {
121        Class {
122            class_num,
123            days: Vec::new()
124        }
125    }
126}
127
128impl Day {
129    pub fn period(&self, period: usize) -> Period {
130        self.periods[period - 1].clone()
131    }
132
133    pub fn list_periods(&self) -> Vec<Period> {
134        self.periods.clone()
135    }
136
137    pub fn new(day_num: u8) -> Day {
138        Day {
139            day_num,
140            periods: Vec::new()
141        }
142    }
143}