-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathschedule-header-parse.go
More file actions
96 lines (82 loc) · 2.59 KB
/
schedule-header-parse.go
File metadata and controls
96 lines (82 loc) · 2.59 KB
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
package main
import (
"strconv"
"strings"
)
type ErrHeaderParseFailed string
func (e ErrHeaderParseFailed) Error() string {
return "Header parsing failed: " + string(e)
}
type roomMap struct {
roomName string
idColumn int
titleColumn int
panelistsColumn int
descColumn int
isZoomColumn int
}
const roomMaxColumns = 5
func (room *roomMap) isComplete() bool {
if room == nil ||
room.roomName == "" ||
room.idColumn < 1 ||
room.titleColumn < 1 ||
room.panelistsColumn < 1 ||
room.descColumn < 1 ||
room.isZoomColumn < 1 {
return false
} else {
return true
}
}
func (room *roomMap) isSafelyReadable(columnCount int) bool {
return room != nil &&
room.idColumn < columnCount &&
room.titleColumn < columnCount &&
room.panelistsColumn < columnCount &&
room.descColumn < columnCount &&
room.isZoomColumn < columnCount
}
func parseScheduleHeader(firstRecord []string, secondRecord []string) ([]roomMap, error) {
// Validation
switch {
case firstRecord == nil:
return nil, ErrHeaderParseFailed("firstRecord cannot be nil")
case secondRecord == nil:
return nil, ErrHeaderParseFailed("secondRecord cannot be nil")
case len(firstRecord) != len(secondRecord):
return nil, ErrHeaderParseFailed("Unable to parse schedule header due to mismatched first/second record length.")
case len(firstRecord) < 4:
return nil, ErrHeaderParseFailed("Header is not sufficently long to contain at least the time and one room set of columns (4).")
case !strings.Contains(firstRecord[0], "Time") && !strings.Contains(secondRecord[0], "Time"):
return nil, ErrHeaderParseFailed("Unable to find 'Time' in first column.")
}
roomMappings := make([]roomMap, 0, 20)
thisRoom := roomMap{}
var roomStartAt int = 1
for i := 1; i < len(firstRecord); i++ {
if firstRecord[i] != "" && thisRoom.roomName == "" {
thisRoom.roomName = firstRecord[i]
}
switch {
case strings.EqualFold(secondRecord[i], "ID"):
thisRoom.idColumn = i
case strings.EqualFold(secondRecord[i], "Title"):
thisRoom.titleColumn = i
case strings.EqualFold(secondRecord[i], "Panelists"):
thisRoom.panelistsColumn = i
case strings.EqualFold(secondRecord[i], "Public Description"):
thisRoom.descColumn = i
case strings.EqualFold(secondRecord[i], "Is Zoom"):
thisRoom.isZoomColumn = i
}
if thisRoom.isComplete() {
roomMappings = append(roomMappings, thisRoom)
thisRoom = roomMap{}
roomStartAt = i + 1
} else if (i - roomStartAt) >= roomMaxColumns {
return nil, ErrHeaderParseFailed("Unable to map room starting at column " + strconv.Itoa(roomStartAt))
}
}
return roomMappings, nil
}