diff options
author | MaurĂcio Antunes <mauricio.abreua@gmail.com> | 2022-11-18 20:30:43 -0300 |
---|---|---|
committer | MaurĂcio Antunes <mauricio.abreua@gmail.com> | 2022-11-18 20:30:43 -0300 |
commit | aa0c1a15f68ed6519dd491b8f241b4e004ba0414 (patch) | |
tree | 3e4d3583634ed713f4674e0bf19e6480fc7bb1fd | |
parent | 0cda208457deae32984b5c0e167ebdba3dbc70fe (diff) |
feat: add command to run next pending exercise
-rw-r--r-- | golings/cmd/cmd_suite_test.go | 10 | ||||
-rw-r--r-- | golings/cmd/run.go | 11 | ||||
-rw-r--r-- | golings/exercises/list.go | 16 | ||||
-rw-r--r-- | golings/exercises/runner.go | 4 | ||||
-rw-r--r-- | golings/fixtures/next/info.toml | 11 | ||||
-rw-r--r-- | golings/fixtures/next/next1/main.go | 7 | ||||
-rw-r--r-- | golings/fixtures/next/next2/main.go | 9 |
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() { + +} |