Files
date-grouper/main.go

76 lines
1.4 KiB
Go

package main
import (
"flag"
"fmt"
"regexp"
"time"
logger "git.site.quack-lab.dev/dave/cylogger"
)
type DateParser interface {
Parse(s string) (time.Time, error)
}
type DateParser8 struct {
re *regexp.Regexp
}
func (dp *DateParser8) Parse(s string) (time.Time, error) {
matches := dp.re.FindStringSubmatch(s)
if len(matches) == 0 {
return time.Time{}, fmt.Errorf("no match")
}
return time.Parse("20060102", matches[0])
}
type DateParserISO struct {
re *regexp.Regexp
}
func (dp *DateParserISO) Parse(s string) (time.Time, error) {
matches := dp.re.FindStringSubmatch(s)
if len(matches) == 0 {
return time.Time{}, fmt.Errorf("no match")
}
return time.Parse("2006-01-02", matches[0])
}
func main() {
flag.Parse()
logger.InitFlag()
if flag.NArg() == 0 {
logger.Error("no files provided")
return
}
parsers := []DateParser{
&DateParser8{re: regexp.MustCompile(`\d{8}`)},
&DateParserISO{re: regexp.MustCompile(`\d{4}-\d{2}-\d{2}`)},
}
files := flag.Args()
for _, file := range files {
logger.Info("processing file: %s", file)
date, err := parseDate(file, parsers)
if err != nil {
logger.Error("error parsing date: %s", err)
continue
}
logger.Info("date: %s", date)
}
}
func parseDate(file string, parsers []DateParser) (time.Time, error) {
for _, parser := range parsers {
date, err := parser.Parse(file)
if err == nil {
return date, nil
}
}
return time.Time{}, fmt.Errorf("no date found")
}