76 lines
1.4 KiB
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")
|
|
}
|