aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaurĂ­cio Antunes <mauricio.abreua@gmail.com>2022-11-18 20:30:43 -0300
committerMaurĂ­cio Antunes <mauricio.abreua@gmail.com>2022-11-18 20:30:43 -0300
commitaa0c1a15f68ed6519dd491b8f241b4e004ba0414 (patch)
tree3e4d3583634ed713f4674e0bf19e6480fc7bb1fd
parent0cda208457deae32984b5c0e167ebdba3dbc70fe (diff)
feat: add command to run next pending exercise
-rw-r--r--golings/cmd/cmd_suite_test.go10
-rw-r--r--golings/cmd/run.go11
-rw-r--r--golings/exercises/list.go16
-rw-r--r--golings/exercises/runner.go4
-rw-r--r--golings/fixtures/next/info.toml11
-rw-r--r--golings/fixtures/next/next1/main.go7
-rw-r--r--golings/fixtures/next/next2/main.go9
7 files changed, 65 insertions, 3 deletions
diff --git a/golings/cmd/cmd_suite_test.go b/golings/cmd/cmd_suite_test.go
index 92f77b1..ef06880 100644
--- a/golings/cmd/cmd_suite_test.go
+++ b/golings/cmd/cmd_suite_test.go
@@ -68,6 +68,16 @@ var _ = Describe("Commands", func() {
Expect(err).To(HaveOccurred())
})
})
+ When("'next' is passed is argument to the command", func() {
+ It("runs the next pending exercise", func() {
+ run := cmd.RunCmd("../fixtures/next/info.toml")
+ run.SetArgs([]string{"next"})
+
+ err := run.Execute()
+
+ Expect(err).To(HaveOccurred())
+ })
+ })
})
})
})
diff --git a/golings/cmd/run.go b/golings/cmd/run.go
index 1efd905..552c234 100644
--- a/golings/cmd/run.go
+++ b/golings/cmd/run.go
@@ -19,10 +19,18 @@ func RunCmd(infoFile string) *cobra.Command {
SilenceUsage: true,
SilenceErrors: true,
RunE: func(cmd *cobra.Command, args []string) error {
+ var exercise exercises.Exercise
+ var err error
+ if args[0] == "next" {
+ exercise, err = exercises.NextPending(infoFile)
+ } else {
+ exercise, err = exercises.Find(args[0], infoFile)
+ }
+
spinner := progressbar.NewOptions(
-1, // a negative number makes turns the progress bar into a spinner
progressbar.OptionEnableColorCodes(true),
- progressbar.OptionSetDescription(color.WhiteString("Running exercise: %s", args[0])),
+ progressbar.OptionSetDescription(color.WhiteString("Running exercise: %s", exercise.Name)),
progressbar.OptionOnCompletion(func() {
color.White("\nRunning complete!\n\n")
}),
@@ -34,7 +42,6 @@ func RunCmd(infoFile string) *cobra.Command {
}
}()
- exercise, err := exercises.Find(args[0], infoFile)
if errors.Is(err, exercises.ErrExerciseNotFound) {
color.White("No exercise found for '%s'", args[0])
return err
diff --git a/golings/exercises/list.go b/golings/exercises/list.go
index 31ebdd4..c466bfa 100644
--- a/golings/exercises/list.go
+++ b/golings/exercises/list.go
@@ -8,6 +8,7 @@ import (
)
var ErrExerciseNotFound = errors.New("exercise not found")
+var ErrNoPendingExercises = errors.New("no pending exercises")
type Info struct {
Exercises []Exercise
@@ -28,6 +29,21 @@ func List(infoFile string) ([]Exercise, error) {
return info.Exercises, nil
}
+func NextPending(infoFile string) (Exercise, error) {
+ allExercises, err := List(infoFile)
+ if err != nil {
+ return Exercise{}, err
+ }
+
+ for _, exercise := range allExercises {
+ if exercise.State() == Pending {
+ return exercise, nil
+ }
+ }
+
+ return Exercise{}, ErrNoPendingExercises
+}
+
func Find(exercise string, infoFile string) (Exercise, error) {
exs, err := List(infoFile)
if err != nil {
diff --git a/golings/exercises/runner.go b/golings/exercises/runner.go
index c9597f6..17b5f61 100644
--- a/golings/exercises/runner.go
+++ b/golings/exercises/runner.go
@@ -19,7 +19,9 @@ func (e Exercise) Run() (Result, error) {
cmd.Stdout = &stdout
cmd.Stderr = &stderr
- return Result{Exercise: e, Out: stdout.String(), Err: stderr.String()}, cmd.Run()
+ err := cmd.Run()
+
+ return Result{Exercise: e, Out: stdout.String(), Err: stderr.String()}, err
}
func BuildArgs(e Exercise) []string {
diff --git a/golings/fixtures/next/info.toml b/golings/fixtures/next/info.toml
new file mode 100644
index 0000000..f3e04c7
--- /dev/null
+++ b/golings/fixtures/next/info.toml
@@ -0,0 +1,11 @@
+[[exercises]]
+name = "next1"
+path = "../fixtures/next/next1/main.go"
+mode = "compile"
+hint = ""
+
+[[exercises]]
+name = "next1"
+path = "../fixtures/next/next2/main.go"
+mode = "compile"
+hint = ""
diff --git a/golings/fixtures/next/next1/main.go b/golings/fixtures/next/next1/main.go
new file mode 100644
index 0000000..c93a8e4
--- /dev/null
+++ b/golings/fixtures/next/next1/main.go
@@ -0,0 +1,7 @@
+// next1
+// Make me compile!
+package main
+
+func main() {
+
+}
diff --git a/golings/fixtures/next/next2/main.go b/golings/fixtures/next/next2/main.go
new file mode 100644
index 0000000..1e86e78
--- /dev/null
+++ b/golings/fixtures/next/next2/main.go
@@ -0,0 +1,9 @@
+// next2
+// Make me compile!
+
+// I AM NOT DONE
+package main
+
+func main() {
+
+}