aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/run.go2
-rw-r--r--src/exercises/exercise.go20
-rw-r--r--src/exercises/list.go35
-rw-r--r--src/exercises/runner.go14
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
}