Skip to content

Commit f1bcde4

Browse files
authored
interpolate args (#13)
1 parent d5b8f07 commit f1bcde4

File tree

5 files changed

+38
-12
lines changed

5 files changed

+38
-12
lines changed

args/args.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package args
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
)
7+
8+
func InterpolateCommand(rawCommand string, optionalPositionalArgs []string) string {
9+
// replace $1, $2, etc. with the optional positional args
10+
for i, arg := range optionalPositionalArgs {
11+
rawCommand = strings.ReplaceAll(rawCommand, fmt.Sprintf("$%d", i+1), arg)
12+
}
13+
return rawCommand
14+
}

checks/command.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@ package checks
33
import (
44
"os/exec"
55

6+
"github.com/bootdotdev/bootdev/args"
67
api "github.com/bootdotdev/bootdev/client"
78
)
89

910
func CLICommand(
1011
assignment api.Assignment,
12+
optionalPositionalArgs []string,
1113
) []api.CLICommandResult {
1214
data := assignment.Assignment.AssignmentDataCLICommand.CLICommandData
1315
responses := make([]api.CLICommandResult, len(data.Commands))
1416
for i, command := range data.Commands {
15-
cmd := exec.Command("sh", "-c", command.Command)
17+
finalCommand := args.InterpolateCommand(command.Command, optionalPositionalArgs)
18+
cmd := exec.Command("sh", "-c", finalCommand)
1619
b, err := cmd.Output()
1720
if ee, ok := err.(*exec.ExitError); ok {
1821
responses[i].ExitCode = ee.ExitCode()

cmd/run.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func init() {
1212
// runCmd represents the run command
1313
var runCmd = &cobra.Command{
1414
Use: "run UUID",
15-
Args: cobra.ExactArgs(1),
15+
Args: cobra.MatchAll(cobra.RangeArgs(1, 10)),
1616
Short: "Run an assignment without submitting",
1717
PreRun: compose(requireUpdated, requireAuth),
1818
RunE: submissionHandler,

cmd/submit.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func init() {
2020
// submitCmd represents the submit command
2121
var submitCmd = &cobra.Command{
2222
Use: "submit UUID",
23-
Args: cobra.MatchAll(cobra.ExactArgs(1)),
23+
Args: cobra.MatchAll(cobra.RangeArgs(1, 10)),
2424
Short: "Submit an assignment",
2525
PreRun: compose(requireUpdated, requireAuth),
2626
RunE: submissionHandler,
@@ -30,6 +30,11 @@ func submissionHandler(cmd *cobra.Command, args []string) error {
3030
cmd.SilenceUsage = true
3131
isSubmit := cmd.Name() == "submit"
3232
assignmentUUID := args[0]
33+
optionalPositionalArgs := []string{}
34+
if len(args) > 1 {
35+
optionalPositionalArgs = args[1:]
36+
}
37+
3338
assignment, err := api.FetchAssignment(assignmentUUID)
3439
if err != nil {
3540
return err
@@ -46,16 +51,16 @@ func submissionHandler(cmd *cobra.Command, args []string) error {
4651
fmt.Println("\nSubmitted! Check the lesson on Boot.dev for results")
4752
}
4853
case "type_cli_command":
49-
results := checks.CLICommand(*assignment)
54+
results := checks.CLICommand(*assignment, optionalPositionalArgs)
5055
data := *assignment.Assignment.AssignmentDataCLICommand
5156
if isSubmit {
5257
failure, err := api.SubmitCLICommandAssignment(assignmentUUID, results)
5358
if err != nil {
5459
return err
5560
}
56-
render.CommandSubmission(data, results, failure)
61+
render.CommandSubmission(data, results, failure, optionalPositionalArgs)
5762
} else {
58-
render.CommandRun(data, results)
63+
render.CommandRun(data, results, optionalPositionalArgs)
5964
}
6065
default:
6166
return errors.New("unsupported assignment type")

render/command.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import (
77
"sync"
88
"time"
99

10+
"github.com/bootdotdev/bootdev/args"
1011
api "github.com/bootdotdev/bootdev/client"
1112
"github.com/charmbracelet/bubbles/spinner"
13+
tea "github.com/charmbracelet/bubbletea"
1214
"github.com/charmbracelet/lipgloss"
1315
"github.com/muesli/termenv"
14-
15-
tea "github.com/charmbracelet/bubbletea"
1616
)
1717

1818
var green = lipgloss.NewStyle().Foreground(lipgloss.Color("2"))
@@ -131,7 +131,7 @@ func (m rootModel) View() string {
131131
if !cmd.finished {
132132
cmdStr += fmt.Sprintf("%s %s", s, cmd.command)
133133
} else if !m.isSubmit {
134-
cmdStr += fmt.Sprintf("%s", cmd.command)
134+
cmdStr += cmd.command
135135
} else if cmd.passed == nil {
136136
cmdStr += gray.Render(fmt.Sprintf("? %s", cmd.command))
137137
} else if *cmd.passed {
@@ -215,23 +215,26 @@ func pointerToBool(a bool) *bool {
215215
func CommandRun(
216216
data api.AssignmentDataCLICommand,
217217
results []api.CLICommandResult,
218+
optionalPositionalArgs []string,
218219
) {
219-
commandRenderer(data, results, nil, false)
220+
commandRenderer(data, results, nil, false, optionalPositionalArgs)
220221
}
221222

222223
func CommandSubmission(
223224
data api.AssignmentDataCLICommand,
224225
results []api.CLICommandResult,
225226
failure *api.StructuredErrCLICommand,
227+
optionalPositionalArgs []string,
226228
) {
227-
commandRenderer(data, results, failure, true)
229+
commandRenderer(data, results, failure, true, optionalPositionalArgs)
228230
}
229231

230232
func commandRenderer(
231233
data api.AssignmentDataCLICommand,
232234
results []api.CLICommandResult,
233235
failure *api.StructuredErrCLICommand,
234236
isSubmit bool,
237+
optionalPositionalArgs []string,
235238
) {
236239
var wg sync.WaitGroup
237240
ch := make(chan tea.Msg, 1)
@@ -259,7 +262,8 @@ func commandRenderer(
259262
defer wg.Done()
260263

261264
for i, cmd := range data.CLICommandData.Commands {
262-
ch <- startCmdMsg{cmd: cmd.Command}
265+
finalCommand := args.InterpolateCommand(cmd.Command, optionalPositionalArgs)
266+
ch <- startCmdMsg{cmd: finalCommand}
263267
for _, test := range cmd.Tests {
264268
ch <- startTestMsg{text: prettyPrint(test)}
265269
}

0 commit comments

Comments
 (0)