-
Notifications
You must be signed in to change notification settings - Fork 6
/
class_schedule.go
59 lines (49 loc) · 1.44 KB
/
class_schedule.go
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
package parse
import (
"encoding/json"
"fmt"
"io"
"time"
"github.com/ditsuke/go-amizone/amizone/models"
"k8s.io/klog/v2"
)
const (
scheduleJsonTimeFormat = "2006/01/02 03:04:05 PM"
)
// ClassSchedule attempts to parse the response of the Amizone diary events API endpoint into
// a models.ClassSchedule instance.
func ClassSchedule(body io.Reader) (models.ClassSchedule, error) {
var diaryEvents models.AmizoneDiaryEvents
if err := json.NewDecoder(body).Decode(&diaryEvents); err != nil {
return nil, fmt.Errorf("%s: %w", ErrFailedToParse, err)
}
var classSchedule models.ClassSchedule
for _, entry := range diaryEvents {
// Only add entries that are of type "C" (class)
if entry.Type != "C" {
continue
}
parseTime := func(timeStr string) time.Time {
t, err := time.Parse(scheduleJsonTimeFormat, timeStr)
if err != nil {
klog.Warning("Failed to parse time for course %s: %s", entry.CourseCode, err.Error())
return time.Unix(0, 0)
}
return t
}
class := models.ScheduledClass{
Course: models.CourseRef{
Code: entry.CourseCode,
Name: entry.CourseName,
},
StartTime: parseTime(entry.Start),
EndTime: parseTime(entry.End),
Faculty: entry.Faculty,
Room: entry.Room,
}
classSchedule = append(classSchedule, class)
}
// We sort the parsed schedule by start time -- because the Amizone events endpoint does not guarantee order.
classSchedule.Sort()
return classSchedule, nil
}