From 19206a9bf5dbac7735b58eb50a2813095aac19d2 Mon Sep 17 00:00:00 2001 From: Dan Jones Date: Wed, 23 Oct 2024 21:24:10 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20WalkFiles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Taskfile.yml | 37 ++++++++++++++++++++++++++ cmd/convids/main.go | 9 ++----- convids/logic.go | 63 +++++++++++++++++++++++++++++++++++++++++++++ convids/methods.go | 49 +++++++++++++++++++++++++++++++---- convids/models.go | 14 +++++++--- 6 files changed, 157 insertions(+), 16 deletions(-) create mode 100644 Taskfile.yml create mode 100644 convids/logic.go diff --git a/.gitignore b/.gitignore index 567609b..c525b60 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ build/ +.task/ diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..47ccef9 --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,37 @@ +# https://taskfile.dev + +version: '3' + +tasks: + fmt: + desc: Format go files + sources: + - "**/*.go" + cmds: + - go fmt ./... + cmd-build: + internal: true + cmds: + - go build -o build/ ./cmd/{{.CMD}} + build-convids: + desc: Builds the convids command + sources: + - cmd/convids/**/*.go + - convids/**/*.go + - internal/cli/*.go + generates: + - build/convids + cmds: + - task: cmd-build + vars: + CMD: convids + build-all: + desc: Builds all available commands + sources: + - "**/*.go" + generates: + - build/convids + cmds: + - task: cmd-build + vars: + CMD: "*" diff --git a/cmd/convids/main.go b/cmd/convids/main.go index e5f01b4..bbe462b 100644 --- a/cmd/convids/main.go +++ b/cmd/convids/main.go @@ -7,7 +7,6 @@ import ( "codeberg.org/danjones000/utils/convids" "codeberg.org/danjones000/utils/internal/cli" "github.com/spf13/pflag" - "gopkg.in/yaml.v3" ) const dataPath = "shows.yml" @@ -26,12 +25,7 @@ func main() { fmt.Println("looping") } - f, err := os.Open(dataPath) - cli.HandleErr(err) - - ydec := yaml.NewDecoder(f) - var data convids.Data - err = ydec.Decode(&data) + data, err := convids.NewData(dataPath) cli.HandleErr(err) fmt.Printf("Data: %+v\n", data) @@ -39,4 +33,5 @@ func main() { for s := range data.AllShows(false) { fmt.Printf("Show: %+v\n", s) } + fmt.Println("\nDone!") } diff --git a/convids/logic.go b/convids/logic.go new file mode 100644 index 0000000..35b1497 --- /dev/null +++ b/convids/logic.go @@ -0,0 +1,63 @@ +package convids + +import ( + "os" + fp "path/filepath" + "regexp" + "strings" + + "gopkg.in/yaml.v3" +) + +func NewData(path string) (*Data, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + ydec := yaml.NewDecoder(f) + var data Data + err = ydec.Decode(&data) + return &data, err +} + +func ensureExtRe(c *Config) (err error) { + if c.extRe != nil { + return nil + } + c.extRe, err = regexp.Compile("(" + strings.Join(c.Extensions, "|") + ")$") + return +} + +func WalkFiles(d *Data, stopOnError, silent bool, cb func(s *Show, path string) error) (err error) { + err = ensureExtRe(d.Config) + if err != nil { + return + } + var files []os.DirEntry + files, err = os.ReadDir(d.Config.Source) + if err != nil { + return + } + for s := range d.AllShows(silent) { + var found bool + for _, file := range files { + if file.IsDir() { + continue + } + if !d.Config.extRe.MatchString(file.Name()) { + continue + } + found, err = s.Match(file.Name()) + if err != nil { + return + } + if found { + err = cb(s, fp.Join(d.Config.Source, file.Name())) + if err != nil && stopOnError { + return + } + } + } + } + return nil +} diff --git a/convids/methods.go b/convids/methods.go index 687d090..2fe95b2 100644 --- a/convids/methods.go +++ b/convids/methods.go @@ -1,22 +1,61 @@ package convids import ( + "errors" "fmt" "iter" + "regexp" "slices" + "strings" ) -func (s Shows) All() iter.Seq[Show] { - return slices.Values(s) +var ErrNoName = errors.New("missing name") + +func (s *Show) Match(path string) (bool, error) { + if s.Pattern != "" { + return s.matchRegexp(path) + } + if s.Name == "" { + return false, ErrNoName + } + return strings.HasPrefix(path, s.Name), nil } -func (d Data) AllShows(silent bool) iter.Seq[Show] { - return func(yield func(Show) bool) { +func (s *Show) matchRegexp(path string) (f bool, err error) { + if s.re == nil { + p := s.Pattern + if !strings.HasPrefix(p, "^") { + p = "^" + p + } + s.re, err = regexp.Compile(p) + if err != nil { + return + } + } + return s.re.MatchString(path), nil +} + +func (ss *Shows) All() iter.Seq[*Show] { + return slices.Values(*ss) +} + +func (d *Data) AllShows(silent bool) iter.Seq[*Show] { + return func(yield func(*Show) bool) { + if d.Config == nil { + return + } for _, show := range d.Config.Shows { + sh := (*d.Shows)[show] + if sh == nil || len(*sh) < 1 { + continue + } if !silent { fmt.Println("\nChecking", show, "shows\n") } - for s := range d.Shows[show].All() { + for s := range sh.All() { + if s == nil { + continue + } if !yield(s) { return } diff --git a/convids/models.go b/convids/models.go index 88ea5f4..1ae6448 100644 --- a/convids/models.go +++ b/convids/models.go @@ -1,23 +1,29 @@ package convids +import "regexp" + type Data struct { - Config Config - Shows ShowMap + Config *Config + Shows *ShowMap } type Config struct { Source string Extensions []string Shows []string + + extRe *regexp.Regexp } -type ShowMap map[string]Shows +type ShowMap map[string]*Shows -type Shows []Show +type Shows []*Show type Show struct { Folder string Pattern string Name string Anime bool + + re *regexp.Regexp }