Neale Pickett
·
2023-04-11
transpiler.go
1package main
2
3import (
4 "bytes"
5 "encoding/json"
6 "io"
7 "log"
8 "time"
9
10 "github.com/dirtbags/moth/v4/pkg/transpile"
11 "github.com/spf13/afero"
12)
13
14// NewTranspilerProvider returns a new TranspilerProvider.
15func NewTranspilerProvider(fs afero.Fs) TranspilerProvider {
16 return TranspilerProvider{fs}
17}
18
19// TranspilerProvider provides puzzles generated from source files on disk
20type TranspilerProvider struct {
21 fs afero.Fs
22}
23
24// Inventory returns a Category list for this provider.
25func (p TranspilerProvider) Inventory() []Category {
26 ret := make([]Category, 0)
27 inv, err := transpile.FsInventory(p.fs)
28 if err != nil {
29 log.Print(err)
30 return ret
31 }
32 for name, points := range inv {
33 ret = append(ret, Category{name, points})
34 }
35 return ret
36}
37
38type nopCloser struct {
39 io.ReadSeeker
40}
41
42func (c nopCloser) Close() error {
43 return nil
44}
45
46// Open returns a file associated with the given category and point value.
47func (p TranspilerProvider) Open(cat string, points int, filename string) (ReadSeekCloser, time.Time, error) {
48 c := transpile.NewFsCategory(p.fs, cat)
49 switch filename {
50 case "", "puzzle.json":
51 p, err := c.Puzzle(points)
52 if err != nil {
53 return nopCloser{new(bytes.Reader)}, time.Time{}, err
54 }
55 jp, err := json.Marshal(p)
56 if err != nil {
57 return nopCloser{new(bytes.Reader)}, time.Time{}, err
58 }
59 return nopCloser{bytes.NewReader(jp)}, time.Now(), nil
60 default:
61 r, err := c.Open(points, filename)
62 return r, time.Now(), err
63 }
64}
65
66// CheckAnswer checks whether an answer si correct.
67func (p TranspilerProvider) CheckAnswer(cat string, points int, answer string) (bool, error) {
68 c := transpile.NewFsCategory(p.fs, cat)
69 return c.Answer(points, answer), nil
70}
71
72// Mothball packages up a category into a mothball.
73func (p TranspilerProvider) Mothball(cat string, w io.Writer) error {
74 c := transpile.NewFsCategory(p.fs, cat)
75 return transpile.Mothball(c, w)
76}
77
78// Maintain performs housekeeping.
79func (p TranspilerProvider) Maintain(updateInterval time.Duration) {
80 // Nothing to do here.
81}
82
83func (p TranspilerProvider) refresh() {
84 // Nothing to do for a theme
85}