package sudoku import ( "errors" "fmt" "git.kleiax.de/homepage/field" "git.kleiax.de/homepage/logic" "git.kleiax.de/homepage/parser" ) type Game struct { field *field.Field solver logic.Solver } func New(input parser.Parser, solver logic.Solver, data []byte, fieldIndex int) (*Game, error) { if input == nil { return nil, errors.New("cannot create game: nil parser") } if err := input.Parse(data); err != nil { return nil, fmt.Errorf("cannot create game: %w", err) } parsedField, err := input.GetField(fieldIndex) if err != nil { return nil, fmt.Errorf("cannot create game: %w", err) } if parsedField == nil || !parsedField.IsValid() { return nil, fmt.Errorf("cannot create game: %w", field.ErrInvalidField) } return &Game{solver: solver, field: parsedField}, nil } func (g *Game) Solve() error { if g == nil || g.field == nil { return field.ErrInvalidField } if err := g.solver.InitStrategies(g.field); err != nil { return err } solved, err := g.solver.Run(0) if err != nil { return err } if !solved { return logic.ErrNoProgress } return nil } func (g *Game) GetField() *field.Field { if g == nil { return nil } return g.field }