1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use serde::{Deserialize, Serialize};
use super::Fetchable;
use crate::entities::{CourseId, EntityType, Module, Room, Staff, Unknown, UnknownId};
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SideBarEvent {
pub federation_id: UnknownId,
pub entity_type: Unknown,
pub elements: Vec<SideBarEventElement>,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RawSideBarEventElement<T: EntityType> {
pub content: Option<String>,
#[serde(bound(deserialize = "T: EntityType"))]
pub federation_id: T::Id,
#[serde(bound(deserialize = "T: EntityType"))]
pub entity_type: T,
pub assignment_context: Option<String>,
pub contains_hyperlinks: bool,
pub is_notes: bool,
pub is_student_specific: bool,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[serde(tag = "label")]
pub enum SideBarEventElement {
Time(RawSideBarEventElement<Unknown>),
#[serde(rename = "Catégorie")]
Category(RawSideBarEventElement<Unknown>),
#[serde(rename = "Matière")]
Module(RawSideBarEventElement<Module>),
#[serde(rename = "Salle")]
Room(RawSideBarEventElement<Room>),
#[serde(rename = "Enseignant")]
Teacher(RawSideBarEventElement<Staff>),
#[serde(rename = "Notes")]
Grades(RawSideBarEventElement<Unknown>),
Name(RawSideBarEventElement<Unknown>),
}
#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SideBarEventRequest {
pub event_id: CourseId,
}
impl Fetchable for SideBarEvent {
type Request = SideBarEventRequest;
const METHOD_NAME: &'static str = "GetSideBarEvent";
}
#[cfg(test)]
mod tests {
use super::*;
use crate::entities::RoomId;
use serde_json::{from_value, json};
#[test]
fn deserialize_side_bar_event_element() {
assert_eq!(
from_value::<SideBarEventElement>(json!({
"label": "Time",
"content": "9/6/2021 8:30 AM-11:45 AM",
"federationId": null,
"entityType": 0,
"assignmentContext": null,
"containsHyperlinks": false,
"isNotes": false,
"isStudentSpecific": false
}))
.unwrap(),
SideBarEventElement::Time(RawSideBarEventElement {
content: Some("9/6/2021 8:30 AM-11:45 AM".to_owned()),
federation_id: UnknownId,
entity_type: Unknown,
assignment_context: None,
contains_hyperlinks: false,
is_notes: false,
is_student_specific: false,
})
);
assert_eq!(
from_value::<SideBarEventElement>(json!({
"label": "Salle",
"content": "CHE2 Larousse haut AMPHITHÉÂTRE 673p",
"federationId": "1042721",
"entityType": 102,
"assignmentContext": "a-start-end",
"containsHyperlinks": false,
"isNotes": false,
"isStudentSpecific": false
}))
.unwrap(),
SideBarEventElement::Room(RawSideBarEventElement {
content: Some("CHE2 Larousse haut AMPHITHÉÂTRE 673p".to_owned()),
federation_id: RoomId("1042721".to_owned()),
entity_type: Room,
assignment_context: Some("a-start-end".to_owned()),
contains_hyperlinks: false,
is_notes: false,
is_student_specific: false,
})
);
}
#[test]
fn deserialize_side_bar_event() {
from_value::<SideBarEvent>(json!({
"federationId": null,
"entityType": 0,
"elements": []
}))
.unwrap();
}
}