diff options
Diffstat (limited to 'pkg/motd/motd.go')
-rw-r--r-- | pkg/motd/motd.go | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/pkg/motd/motd.go b/pkg/motd/motd.go new file mode 100644 index 0000000..db21025 --- /dev/null +++ b/pkg/motd/motd.go @@ -0,0 +1,118 @@ +package motd + +import ( + "encoding/json" + "io/ioutil" + "log" + "os" + "time" +) + +const TimeString = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone +const ExampleFile = "motd-example.json" + +func ParseFile(f string) (Messages, error) { + jsonFile, err := os.Open(f) + if err != nil { + panic(err) + } + defer jsonFile.Close() + byteVal, err := ioutil.ReadAll(jsonFile) + if err != nil { + panic(err) + } + return getFromJSON(byteVal) +} + +func getFromJSON(b []byte) (Messages, error) { + var m Messages + json.Unmarshal(b, &m) + return m, nil +} + +type Messages struct { + Messages []Message `json:"motd"` +} + +func (m *Messages) Length() int { + return len(m.Messages) +} + +type Message struct { + Begin string `json:"begin"` + End string `json:"end"` + Type string `json:"type"` + Platform string `json:"platform"` + Urgency string `json:"urgency"` + Text []LocalizedText `json:"text"` +} + +func (m *Message) IsValid() bool { + valid := (m.IsValidBegin() && m.IsValidEnd() && + m.IsValidType() && m.IsValidPlatform() && m.IsValidUrgency() && + m.HasLocalizedText()) + return valid +} + +func (m *Message) IsValidBegin() bool { + _, err := time.Parse(TimeString, m.Begin) + if err != nil { + log.Println(err) + return false + } + return true +} + +func (m *Message) IsValidEnd() bool { + endTime, err := time.Parse(TimeString, m.End) + if err != nil { + log.Println(err) + return false + } + beginTime, err := time.Parse(TimeString, m.Begin) + if err != nil { + log.Println(err) + return false + } + if !beginTime.Before(endTime) { + log.Println("begin ts should be before end") + return false + } + return true +} + +func (m *Message) IsValidType() bool { + switch m.Type { + case "once", "daily": + return true + default: + return false + } +} + +func (m *Message) IsValidPlatform() bool { + switch m.Platform { + case "windows", "linux", "osx", "all": + return true + default: + return false + } +} + +func (m *Message) IsValidUrgency() bool { + switch m.Urgency { + case "normal", "critical": + return true + default: + return false + } +} + +func (m *Message) HasLocalizedText() bool { + return len(m.Text) > 0 +} + +type LocalizedText struct { + Lang string `json:"lang"` + Str string `json:"str"` +} |