headless_lms_models/library/
mod.rs1use crate::prelude::*;
2use utoipa::ToSchema;
3
4pub mod content_management;
5pub mod copying;
6pub mod course_instances;
7pub mod course_stats;
8pub mod custom_view_exercises;
9pub mod global_stats;
10pub mod grading;
11pub mod oauth;
12pub mod page_visit_stats;
13pub mod peer_or_self_reviewing;
14pub mod progressing;
15pub mod regrading;
16pub mod students_view;
17pub mod user_exercise_state_updater;
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
20
21pub enum TimeGranularity {
22 Year,
23 Month,
24 Day,
25}
26
27impl TimeGranularity {
28 pub fn get_sql_units(&self) -> (&'static str, &'static str) {
31 match self {
32 TimeGranularity::Year => ("years", "year"),
33 TimeGranularity::Month => ("months", "month"),
34 TimeGranularity::Day => ("days", "day"),
35 }
36 }
37}
38
39impl std::fmt::Display for TimeGranularity {
40 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
41 match self {
42 TimeGranularity::Year => write!(f, "Year"),
43 TimeGranularity::Month => write!(f, "Month"),
44 TimeGranularity::Day => write!(f, "Day"),
45 }
46 }
47}
48
49#[derive(Debug)]
50pub struct ParseTimeGranularityError;
51
52impl std::fmt::Display for ParseTimeGranularityError {
53 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
54 write!(f, "invalid time granularity")
55 }
56}
57
58impl std::error::Error for ParseTimeGranularityError {}
59
60impl std::str::FromStr for TimeGranularity {
61 type Err = ParseTimeGranularityError;
62
63 fn from_str(s: &str) -> Result<Self, Self::Err> {
64 match s.to_lowercase().as_str() {
65 "year" => Ok(TimeGranularity::Year),
66 "month" => Ok(TimeGranularity::Month),
67 "day" => Ok(TimeGranularity::Day),
68 _ => Err(ParseTimeGranularityError),
69 }
70 }
71}
72
73impl TryFrom<String> for TimeGranularity {
74 type Error = ParseTimeGranularityError;
75
76 fn try_from(value: String) -> Result<Self, Self::Error> {
77 value.parse()
78 }
79}