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  }