diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd/run.go | 2 | ||||
-rw-r--r-- | src/exercises/exercise.go | 20 | ||||
-rw-r--r-- | src/exercises/list.go | 35 | ||||
-rw-r--r-- | src/exercises/runner.go | 14 |
4 files changed, 49 insertions, 22 deletions
diff --git a/src/cmd/run.go b/src/cmd/run.go index aeec65d..fb62f67 100644 --- a/src/cmd/run.go +++ b/src/cmd/run.go @@ -21,7 +21,7 @@ var cmdRun = &cobra.Command{ out, err := exercises.Run(args[0]) fmt.Println(out) if err != nil { - color.Red("Your exercise is failing") + color.Red("Your exercise is failing: %s", err) os.Exit(1) } color.Green("Congratulations!") diff --git a/src/exercises/exercise.go b/src/exercises/exercise.go new file mode 100644 index 0000000..2783381 --- /dev/null +++ b/src/exercises/exercise.go @@ -0,0 +1,20 @@ +package exercises + +type Exercise struct { + Name string + Path string + Mode string + Hint string + State State +} + +type State int + +const ( + Pending State = iota + 1 + Done +) + +func (s State) String() string { + return [...]string{"Pending", "Done"}[s-1] +} diff --git a/src/exercises/list.go b/src/exercises/list.go index 3719527..c0c7261 100644 --- a/src/exercises/list.go +++ b/src/exercises/list.go @@ -1,29 +1,13 @@ package exercises import ( + "errors" "os" "github.com/pelletier/go-toml/v2" ) -type State int - -const ( - Pending State = iota + 1 - Done -) - -func (s State) String() string { - return [...]string{"Pending", "Done"}[s-1] -} - -type Exercise struct { - Name string - Path string - Mode string - Hint string - State State -} +var ErrExerciseNotFound = errors.New("exercise not found") type Info struct { Exercises []Exercise @@ -43,3 +27,18 @@ func List() ([]Exercise, error) { return info.Exercises, nil } + +func Find(exercise string) (Exercise, error) { + exs, err := List() + if err != nil { + return Exercise{}, err + } + + for _, ex := range exs { + if ex.Name == exercise { + return ex, nil + } + } + + return Exercise{}, ErrExerciseNotFound +} diff --git a/src/exercises/runner.go b/src/exercises/runner.go index 1fe2a32..1490f13 100644 --- a/src/exercises/runner.go +++ b/src/exercises/runner.go @@ -1,9 +1,17 @@ package exercises -import "os/exec" +import ( + "fmt" + "os/exec" +) -func Run(exercise string) (string, error) { - cmd := exec.Command("go", "run", "./exercises/"+exercise+".go") +func Run(name string) (string, error) { + exercise, err := Find(name) + if err != nil { + return "", err + } + + cmd := exec.Command("go", "run", fmt.Sprintf("./%s", exercise.Path)) cOut, err := cmd.CombinedOutput() return string(cOut), err } |