From 8c39d6f40e72798b3dfad266e2f84a6c83cffdd4 Mon Sep 17 00:00:00 2001 From: Aleksey Lobanov Date: Tue, 2 Jan 2024 21:05:33 +0000 Subject: [PATCH] feat: Package for command-line arguments --- cmd/gogrep/main.go | 22 +++++++--------------- internal/cui-args/args_reader.go | 29 +++++++++++++++++++++++++++++ internal/models/config.go | 9 +++++++++ internal/processing/processing.go | 2 +- 4 files changed, 46 insertions(+), 16 deletions(-) create mode 100644 internal/cui-args/args_reader.go create mode 100644 internal/models/config.go diff --git a/cmd/gogrep/main.go b/cmd/gogrep/main.go index 3a0eec1..8e75768 100644 --- a/cmd/gogrep/main.go +++ b/cmd/gogrep/main.go @@ -3,9 +3,10 @@ package main import ( "fmt" "io/fs" + "log" "path/filepath" - "regexp" + cui "gitea.likemath.ru/alex/gogrep/internal/cui-args" models "gitea.likemath.ru/alex/gogrep/internal/models" processing "gitea.likemath.ru/alex/gogrep/internal/processing" ) @@ -14,18 +15,9 @@ import ( const ChannelBuffering = 10 func main() { - pathPattern := "git/hook" - rePathPattern, err := regexp.Compile(pathPattern) + config, err := cui.ProcessConsoleArguments() if err != nil { - fmt.Printf("Unable to compile path pattern Regexp: %v\n", pathPattern) - return - } - - textPattern := "the commit" - reTextPattern, err := regexp.Compile(textPattern) - if err != nil { - fmt.Printf("Unable to compile text pattern Regexp: %v\n", textPattern) - return + log.Fatalf("Invalid config: %v\n", err) } processedChannel := make(chan models.FileMatchData, ChannelBuffering) totalFiles := 0 @@ -34,7 +26,7 @@ func main() { fmt.Printf("prevent panic by handling failure accessing a path %q: %v\n", path, err) return err } - if rePathPattern.FindString(path) == "" { + if config.PathPattern.FindString(path) == "" { return nil } // if info.IsDir() && info.Name() == subDirToSkip { @@ -44,7 +36,7 @@ func main() { if info.IsDir() { return nil } - go processing.ProcessSingleFile(*reTextPattern, path, processedChannel) + go processing.ProcessSingleFile(config.TextPattern, path, processedChannel) totalFiles++ return nil @@ -62,7 +54,7 @@ func main() { } if err != nil { - fmt.Printf("error walking the path %q: %v\n", pathPattern, err) + fmt.Printf("error walking the path %q: %v\n", config.PathPattern, err) return } } diff --git a/internal/cui-args/args_reader.go b/internal/cui-args/args_reader.go new file mode 100644 index 0000000..f9e4d73 --- /dev/null +++ b/internal/cui-args/args_reader.go @@ -0,0 +1,29 @@ +package cuiargs + +import ( + "fmt" + "regexp" + + models "gitea.likemath.ru/alex/gogrep/internal/models" +) + +// ProcessConsoleArguments fills internal grep config +// Returns error if arguments filling is correct, but arguments are incorrect +// Panics and shows info if arguments are invalid +func ProcessConsoleArguments() (*models.GrepConfigInternal, error) { + res := &models.GrepConfigInternal{} + + var err error + pathPattern := "git/hook" + res.PathPattern, err = regexp.Compile(pathPattern) + if err != nil { + return nil, fmt.Errorf("unable to compile path pattern Regexp: %v", pathPattern) + } + + textPattern := "the commit" + res.TextPattern, err = regexp.Compile(textPattern) + if err != nil { + return nil, fmt.Errorf("unable to compile text pattern Regexp: %v", textPattern) + } + return res, nil +} diff --git a/internal/models/config.go b/internal/models/config.go new file mode 100644 index 0000000..85dbe8d --- /dev/null +++ b/internal/models/config.go @@ -0,0 +1,9 @@ +package models + +import "regexp" + +// GrepConfigInternal defines valid grep configuration after parameters parsing +type GrepConfigInternal struct { + PathPattern *regexp.Regexp + TextPattern *regexp.Regexp +} diff --git a/internal/processing/processing.go b/internal/processing/processing.go index edbd22a..3c77646 100644 --- a/internal/processing/processing.go +++ b/internal/processing/processing.go @@ -11,7 +11,7 @@ import ( ) // ProcessSingleFile processes file and send it Result to channel -func ProcessSingleFile(rePattern regexp.Regexp, path string, out chan models.FileMatchData) { +func ProcessSingleFile(rePattern *regexp.Regexp, path string, out chan models.FileMatchData) { file, err := os.Open(path) if err != nil { log.Fatal(err)