github.com/monomonedula/gopdd@v1.2.1/pkg/gopdd/base.go (about) 1 package gopdd 2 3 import ( 4 "encoding/json" 5 "errors" 6 "os" 7 "runtime" 8 "runtime/debug" 9 10 "github.com/sirupsen/logrus" 11 ) 12 13 type Base struct { 14 Dir string 15 Exclude []string 16 Include []string 17 Rules []Rule 18 SkipGitignore bool 19 Logger *logrus.Logger 20 } 21 22 func (b Base) Puzzles(skipErrors bool) []Puzzle { 23 var dir string 24 if b.Dir != "" { 25 dir = b.Dir 26 } else { 27 var err error 28 dir, err = os.Getwd() 29 if err != nil { 30 panic(err) 31 } 32 } 33 buildInfo, _ := debug.ReadBuildInfo() 34 b.Logger.Infof("My version is %s", buildInfo.Main.Version) 35 b.Logger.Infof("Go version is %s", runtime.Version()) 36 b.Logger.Infof("Reading from root dir %s", dir) 37 38 sources, err := MakeSources(dir, b.Exclude, b.Include, !b.SkipGitignore) 39 if err != nil { 40 panic(err) 41 } 42 var puzzles []Puzzle 43 for _, file := range sources.fetch() { 44 collected, err := file.CollectPuzzles(skipErrors) 45 if err != nil { 46 panic(err) 47 } 48 for _, p := range collected { 49 b.Logger.Infof("Puzzle %s %d/%s at %s", p.Id, p.Estimate, p.Role, p.File) 50 puzzles = append(puzzles, p) 51 } 52 } 53 err = b.ApplyRules(puzzles) 54 if err != nil { 55 panic(err) 56 } 57 return puzzles 58 } 59 60 func (b Base) JsonPuzzles(skipErrors bool) []byte { 61 out, err := json.Marshal(b.Puzzles(skipErrors)) 62 if err != nil { 63 panic(err) 64 } 65 return out 66 } 67 68 func (b Base) ApplyRules(puzzles []Puzzle) error { 69 total := 0 70 for _, rule := range b.Rules { 71 errors := rule.ApplyTo(puzzles) 72 total += len(errors) 73 for _, err := range errors { 74 b.Logger.Error(err) 75 } 76 } 77 if total == 0 { 78 return nil 79 } 80 b.Logger.Errorf("Got %d errors. See logs above", total) 81 return errors.New("puzzles do not comply with the rules") 82 }