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}