package main import ( "bufio" "encoding/csv" "encoding/json" "fmt" "io" "log" "os" "path" "sort" "strings" "time" ) type MyTime time.Time func (mt *MyTime) UnmarshalJSON(b []byte) error { s := strings.Trim(string(b), "\"") t, err := time.Parse("2006-01-02", s) if err != nil { return err } *mt = MyTime(t) return nil } func ParseDate(b string) MyTime { s := strings.Trim(b, "\"") t, err := time.Parse("2006-01-02", s) if err != nil { return MyTime{} } return MyTime(t) } func (mt *MyTime) ParseDate(b []byte) error { s := strings.Trim(string(b), "\"") t, err := time.Parse("2006-01-02", s) if err != nil { return err } *mt = MyTime(t) return nil } func (mt MyTime) MarshalJSON() ([]byte, error) { return json.Marshal(mt) } var months = map[string]string{ "1": "Jan", "2": "Feb", "3": "Mrt", "4": "Apr", "5": "Mei", "6": "Jun", "7": "Jul", "8": "Aug", "9": "Sept", "10": "Okt", "11": "Nov", "12": "Dec", } var monthsLong = map[string]string{ "1": "Januari", "2": "Februari", "3": "Maart", "4": "April", "5": "Mei", "6": "Juni", "7": "July", "8": "Augustus", "9": "September", "10": "Oktober", "11": "November", "12": "December", } func (mt MyTime) Format() string { t := time.Time(mt) return fmt.Sprintf("%v %v %v", t.Format("Jan"), t.Format("02"), t.Format("2006")) } func (mt MyTime) Title() string { t := time.Time(mt) return fmt.Sprintf("%v %v", t.Format("Januari"), t.Format("2006")) } type EventFlags struct { Soldout bool Tryout bool Premiere bool Preview bool XL bool Solo bool } type Event struct { Date MyTime `json:"date"` Venue string `json:"venue"` City string `json:"city"` Link string `json:"link"` Time string `json:"time"` Title string `json:"title"` Flags EventFlags `json:"flags"` } func (e *Event) SetFlags(flags string) { for _, flag := range strings.Split(flags, ",") { switch strings.Trim(strings.ToLower(flag), " \t") { case "uitverkocht": e.Flags.Soldout = true case "tryout": e.Flags.Tryout = true case "preview": e.Flags.Preview = true case "premiere": e.Flags.Premiere = true case "solo": e.Flags.Solo = true case "xl": e.Flags.XL = true } } } func getEvents() *[]Event { var events []Event f, err := os.Open(path.Join(ROOT_DIR, "data/events.csv")) if err != nil { log.Fatal(err) } defer f.Close() reader := csv.NewReader(bufio.NewReader(f)) reader.Comma = ';' now := time.Now() for { line, error := reader.Read() if error == io.EOF { break } else if error != nil { log.Fatal(error) } if line[0] == "date" { continue } if now.After( (time.Time(ParseDate(line[0]))).Local().Add(time.Hour * time.Duration(24)), ) { continue } event := Event{ Date: ParseDate(line[0]), Time: line[1], City: line[2], Title: line[3], Venue: line[4], Link: line[5], } event.SetFlags(line[6]) events = append(events, event) } sort.SliceStable(events, func(i, j int) bool { a := events[i] b := events[j] return time.Time(a.Date).Before(time.Time(b.Date)) }) return &events }