Skip to content

Rewrite the output system #345

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 22 commits into from
Aug 28, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions cli/board/attach.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ import (
"os"

"github.com/arduino/arduino-cli/cli/errorcodes"
"github.com/arduino/arduino-cli/cli/feedback"
"github.com/arduino/arduino-cli/cli/instance"
"github.com/arduino/arduino-cli/cli/output"
"github.com/arduino/arduino-cli/commands/board"
"github.com/arduino/arduino-cli/common/formatter"
rpc "github.com/arduino/arduino-cli/rpc/commands"
"github.com/spf13/cobra"
)
Expand Down Expand Up @@ -63,7 +63,7 @@ func runAttachCommand(cmd *cobra.Command, args []string) {
SearchTimeout: attachFlags.searchTimeout,
}, output.TaskProgress())
if err != nil {
formatter.PrintError(err, "attach board error")
feedback.Errorf("Attach board error: %v", err)
os.Exit(errorcodes.ErrGeneric)
}
}
76 changes: 51 additions & 25 deletions cli/board/details.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ package board

import (
"context"
"fmt"
"os"

"github.com/arduino/arduino-cli/cli/errorcodes"
"github.com/arduino/arduino-cli/cli/feedback"
"github.com/arduino/arduino-cli/cli/instance"
"github.com/arduino/arduino-cli/cli/output"
"github.com/arduino/arduino-cli/commands/board"
"github.com/arduino/arduino-cli/common/formatter"
rpc "github.com/arduino/arduino-cli/rpc/commands"
"github.com/arduino/arduino-cli/table"
"github.com/fatih/color"
"github.com/spf13/cobra"
)

Expand All @@ -47,42 +47,68 @@ func runDetailsCommand(cmd *cobra.Command, args []string) {
})

if err != nil {
formatter.PrintError(err, "Error getting board details")
feedback.Errorf("Error getting board details: %v", err)
os.Exit(errorcodes.ErrGeneric)
}
if output.JSONOrElse(res) {
outputDetailsResp(res)
}

feedback.PrintResult(detailsResult{details: res})
}

func outputDetailsResp(details *rpc.BoardDetailsResp) {
table := output.NewTable()
table.SetColumnWidthMode(1, output.Average)
table.AddRow("Board name:", details.Name)
// ouput from this command requires special formatting, let's create a dedicated
// feedback.Result implementation
type detailsResult struct {
details *rpc.BoardDetailsResp
}

func (dr detailsResult) Data() interface{} {
return dr.details
}

func (dr detailsResult) String() string {
details := dr.details
// Table is 4 columns wide:
// | | | | |
// Board name: Arduino Nano
//
// Required tools: arduino:avr-gcc 5.4.0-atmel3.6.1-arduino2
// arduino:avrdude 6.3.0-arduino14
// arduino:arduinoOTA 1.2.1
//
// Option: Processor cpu
// ATmega328P ✔ cpu=atmega328
// ATmega328P (Old Bootloader) cpu=atmega328old
// ATmega168 cpu=atmega168
t := table.New()
t.SetColumnWidthMode(1, table.Average)
t.AddRow("Board name:", details.Name)

for i, tool := range details.RequiredTools {
head := ""
if i == 0 {
table.AddRow()
head = "Required tools:"
t.AddRow() // get some space from above
t.AddRow("Required tools:", tool.Packager+":"+tool.Name, "", tool.Version)
continue
}
table.AddRow(head, tool.Packager+":"+tool.Name, "", tool.Version)
t.AddRow("", tool.Packager+":"+tool.Name, "", tool.Version)
}

for _, option := range details.ConfigOptions {
table.AddRow()
table.AddRow("Option:",
option.OptionLabel,
"", option.Option)
t.AddRow() // get some space from above
t.AddRow("Option:", option.OptionLabel, "", option.Option)
for _, value := range option.Values {
green := color.New(color.FgGreen)
if value.Selected {
table.AddRow("",
output.Green(value.ValueLabel),
output.Green("✔"), output.Green(option.Option+"="+value.Value))
t.AddRow("",
table.NewCell(value.ValueLabel, green),
table.NewCell("✔", green),
table.NewCell(option.Option+"="+value.Value, green))
} else {
table.AddRow("",
t.AddRow("",
value.ValueLabel,
"", option.Option+"="+value.Value)
"",
option.Option+"="+value.Value)
}
}
}
fmt.Print(table.Render())

return t.Render()
}
27 changes: 15 additions & 12 deletions cli/board/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,17 @@
package board

import (
"fmt"
"os"
"sort"
"time"

"github.com/arduino/arduino-cli/cli/errorcodes"
"github.com/arduino/arduino-cli/cli/feedback"
"github.com/arduino/arduino-cli/cli/globals"
"github.com/arduino/arduino-cli/cli/instance"
"github.com/arduino/arduino-cli/cli/output"
"github.com/arduino/arduino-cli/commands/board"
"github.com/arduino/arduino-cli/common/formatter"
rpc "github.com/arduino/arduino-cli/rpc/commands"
"github.com/arduino/arduino-cli/table"
"github.com/spf13/cobra"
)

Expand All @@ -54,35 +54,38 @@ var listFlags struct {
// runListCommand detects and lists the connected arduino boards
func runListCommand(cmd *cobra.Command, args []string) {
if timeout, err := time.ParseDuration(listFlags.timeout); err != nil {
formatter.PrintError(err, "Invalid timeout.")
feedback.Errorf("Invalid timeout: %v", err)
os.Exit(errorcodes.ErrBadArgument)
} else {
time.Sleep(timeout)
}

ports, err := board.List(instance.CreateInstance().GetId())
if err != nil {
formatter.PrintError(err, "Error detecting boards")
feedback.Errorf("Error detecting boards: %v", err)
os.Exit(errorcodes.ErrNetwork)
}

if output.JSONOrElse(ports) {
if globals.OutputFormat == "json" {
feedback.PrintJSON(ports)
} else {
outputListResp(ports)
}
}

func outputListResp(ports []*rpc.DetectedPort) {
if len(ports) == 0 {
formatter.Print("No boards found.")
feedback.Print("No boards found.")
return
}
sort.Slice(ports, func(i, j int) bool {
x, y := ports[i], ports[j]
return x.GetProtocol() < y.GetProtocol() ||
(x.GetProtocol() == y.GetProtocol() && x.GetAddress() < y.GetAddress())
})
table := output.NewTable()
table.SetHeader("Port", "Type", "Board Name", "FQBN")

t := table.New()
t.SetHeader("Port", "Type", "Board Name", "FQBN")
for _, port := range ports {
address := port.GetProtocol() + "://" + port.GetAddress()
if port.GetProtocol() == "serial" {
Expand All @@ -97,16 +100,16 @@ func outputListResp(ports []*rpc.DetectedPort) {
for _, b := range boards {
board := b.GetName()
fqbn := b.GetFQBN()
table.AddRow(address, protocol, board, fqbn)
t.AddRow(address, protocol, board, fqbn)
// show address and protocol only on the first row
address = ""
protocol = ""
}
} else {
board := "Unknown"
fqbn := ""
table.AddRow(address, protocol, board, fqbn)
t.AddRow(address, protocol, board, fqbn)
}
}
fmt.Print(table.Render())
feedback.Print(t.Render())
}
20 changes: 11 additions & 9 deletions cli/board/listall.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ package board

import (
"context"
"fmt"
"os"
"sort"

"github.com/arduino/arduino-cli/cli/errorcodes"
"github.com/arduino/arduino-cli/cli/feedback"
"github.com/arduino/arduino-cli/cli/globals"
"github.com/arduino/arduino-cli/cli/instance"
"github.com/arduino/arduino-cli/cli/output"
"github.com/arduino/arduino-cli/commands/board"
"github.com/arduino/arduino-cli/common/formatter"
rpc "github.com/arduino/arduino-cli/rpc/commands"
"github.com/arduino/arduino-cli/table"
"github.com/spf13/cobra"
)

Expand All @@ -54,11 +54,13 @@ func runListAllCommand(cmd *cobra.Command, args []string) {
SearchArgs: args,
})
if err != nil {
formatter.PrintError(err, "Error listing boards")
feedback.Errorf("Error listing boards: %v", err)
os.Exit(errorcodes.ErrGeneric)
}

if output.JSONOrElse(list) {
if globals.OutputFormat == "json" {
feedback.PrintJSON(list)
} else {
outputBoardListAll(list)
}
}
Expand All @@ -68,10 +70,10 @@ func outputBoardListAll(list *rpc.BoardListAllResp) {
return list.Boards[i].GetName() < list.Boards[j].GetName()
})

table := output.NewTable()
table.SetHeader("Board Name", "FQBN")
t := table.New()
t.SetHeader("Board Name", "FQBN")
for _, item := range list.GetBoards() {
table.AddRow(item.GetName(), item.GetFQBN())
t.AddRow(item.GetName(), item.GetFQBN())
}
fmt.Print(table.Render())
feedback.Print(t.Render())
}
Loading