From ea60b179c569d839d06dd947e414015db353a39d Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Wed, 1 Oct 2025 12:57:37 +0200 Subject: [PATCH] Implement simple parsering --- go.mod | 11 +++++++++ go.sum | 28 +++++++++++++++++++++ main.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 go.sum create mode 100644 main.go diff --git a/go.mod b/go.mod index 249357b..efd72d4 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,14 @@ module datesorter go 1.23.3 + +require git.site.quack-lab.dev/dave/cylogger v1.4.0 + +require ( + github.com/google/go-cmp v0.5.9 // indirect + github.com/hexops/valast v1.5.0 // indirect + golang.org/x/mod v0.7.0 // indirect + golang.org/x/sys v0.3.0 // indirect + golang.org/x/tools v0.4.0 // indirect + mvdan.cc/gofumpt v0.4.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..33bd5b7 --- /dev/null +++ b/go.sum @@ -0,0 +1,28 @@ +git.site.quack-lab.dev/dave/cylogger v1.4.0 h1:3Ca7V5JWvruARJd5S8xDFwW9LnZ9QInqkYLRdrEFvuY= +git.site.quack-lab.dev/dave/cylogger v1.4.0/go.mod h1:wctgZplMvroA4X6p8f4B/LaCKtiBcT1Pp+L14kcS8jk= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/hexops/autogold v0.8.1 h1:wvyd/bAJ+Dy+DcE09BoLk6r4Fa5R5W+O+GUzmR985WM= +github.com/hexops/autogold v0.8.1/go.mod h1:97HLDXyG23akzAoRYJh/2OBs3kd80eHyKPvZw0S5ZBY= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/hexops/valast v1.5.0 h1:FBTuvVi0wjTngtXJRZXMbkN/Dn6DgsUsBwch2DUJU8Y= +github.com/hexops/valast v1.5.0/go.mod h1:Jcy1pNH7LNraVaAZDLyv21hHg2WBv9Nf9FL6fGxU7o4= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM= +mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= diff --git a/main.go b/main.go new file mode 100644 index 0000000..1932167 --- /dev/null +++ b/main.go @@ -0,0 +1,75 @@ +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") +}