Skip to content

Improve output format #32

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 17 commits into from
Sep 13, 2021
Merged
11 changes: 6 additions & 5 deletions arduino/cli/commander.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package cli
import (
"context"
"fmt"
"io/ioutil"
"os"
"path/filepath"

Expand All @@ -24,8 +23,8 @@ type commander struct {
// programmatically call arduino-cli commands.
// It directly imports the golang packages of the arduino-cli.
func NewCommander() (arduino.Commander, error) {
// Discard arduino-cli log messages
logrus.SetOutput(ioutil.Discard)
// Discard arduino-cli log info messages
logrus.SetLevel(logrus.PanicLevel)
// Initialize arduino-cli configuration
configuration.Settings = configuration.Init(configuration.FindConfigFileInArgsOrWorkingDirectory(os.Args))
// Create arduino-cli instance, needed to execute arduino-cli commands
Expand All @@ -35,6 +34,8 @@ func NewCommander() (arduino.Commander, error) {
return nil, err
}

// Re-enable info level log
logrus.SetLevel(logrus.InfoLevel)
cmd := &commander{inst}
return cmd, nil
}
Expand Down Expand Up @@ -62,10 +63,10 @@ func (c *commander) UploadBin(fqbn, bin, port string) error {
Verbose: false,
}

if _, err := upload.Upload(context.Background(), req, os.Stdout, os.Stderr); err != nil {
l := logrus.StandardLogger().WithField("source", "arduino-cli").Writer()
if _, err := upload.Upload(context.Background(), req, l, l); err != nil {
err = fmt.Errorf("%s: %w", "uploading binary", err)
return err
}

return nil
}
70 changes: 70 additions & 0 deletions cli/cli.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package cli

import (
"fmt"
"io/ioutil"
"os"
"strings"

"github.com/arduino/arduino-cli/cli/errorcodes"
"github.com/arduino/arduino-cli/cli/feedback"
"github.com/arduino/iot-cloud-cli/cli/config"
"github.com/arduino/iot-cloud-cli/cli/device"
"github.com/arduino/iot-cloud-cli/cli/thing"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

var cliFlags struct {
verbose bool
outputFormat string
}

func Execute() {
cli := &cobra.Command{
Use: "arduino-cloud-cli",
Short: "Arduino Cloud CLI.",
Long: "Arduino Cloud Command Line Interface (arduino-cloud-cli).",
PersistentPreRun: preRun,
}

cli.AddCommand(config.NewCommand())
cli.AddCommand(device.NewCommand())
cli.AddCommand(thing.NewCommand())

cli.PersistentFlags().BoolVarP(&cliFlags.verbose, "verbose", "v", false, "Print the logs on the standard output.")
cli.PersistentFlags().StringVar(&cliFlags.outputFormat, "format", "text", "The output format, can be {text|json}.")

if err := cli.Execute(); err != nil {
fmt.Fprintln(os.Stderr, err)
}
}

func parseFormatString(arg string) (feedback.OutputFormat, bool) {
f, found := map[string]feedback.OutputFormat{
"json": feedback.JSON,
"text": feedback.Text,
}[arg]

return f, found
}

func preRun(cmd *cobra.Command, args []string) {
logrus.SetOutput(ioutil.Discard)
// enable log only if verbose flag is passed
if cliFlags.verbose {
logrus.SetLevel(logrus.InfoLevel)
logrus.SetOutput(os.Stdout)
}

// normalize the format strings
cliFlags.outputFormat = strings.ToLower(cliFlags.outputFormat)
// check the right output format was passed
format, found := parseFormatString(cliFlags.outputFormat)
if !found {
feedback.Error("Invalid output format: " + cliFlags.outputFormat)
os.Exit(errorcodes.ErrBadCall)
}
// use the output format to configure the Feedback
feedback.SetFormat(format)
}
22 changes: 12 additions & 10 deletions cli/config/config.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package config

import (
"fmt"
"os"
"strings"

"github.com/arduino/arduino-cli/cli/errorcodes"
"github.com/arduino/arduino-cli/cli/feedback"
paths "github.com/arduino/go-paths-helper"
"github.com/arduino/iot-cloud-cli/command/config"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
Expand All @@ -22,17 +24,18 @@ func NewCommand() *cobra.Command {
Use: "config",
Short: "Set the configuration file",
Long: "Set the configuration file to access Arduino IoT Cloud",
RunE: runConfigCommand,
Run: runConfigCommand,
}
configCommand.Flags().StringVarP(&configFlags.file, "file", "f", "", "Existing configuration yaml file")
configCommand.Flags().StringVarP(&configFlags.client, "client", "c", "", "Client ID")
configCommand.Flags().StringVarP(&configFlags.secret, "secret", "s", "", "Secret ID")
return configCommand
}

func runConfigCommand(cmd *cobra.Command, args []string) error {
func runConfigCommand(cmd *cobra.Command, args []string) {
if configFlags.file == "" && (configFlags.client == "" || configFlags.secret == "") {
return fmt.Errorf("%s", "Provide either a yaml file or credentials\n")
feedback.Error("Error during config: provide either a yaml file or credentials")
os.Exit(errorcodes.ErrGeneric)
}

conf := viper.New()
Expand All @@ -45,8 +48,8 @@ func runConfigCommand(cmd *cobra.Command, args []string) error {
conf.AddConfigPath(".")
err := conf.ReadInConfig()
if err != nil {
feedback.Errorf("Fatal error config file: %v", err)
return err
feedback.Errorf("Error during config: fatal error config file: %v", err)
os.Exit(errorcodes.ErrGeneric)
}

} else {
Expand All @@ -56,10 +59,9 @@ func runConfigCommand(cmd *cobra.Command, args []string) error {

err := config.Config(conf)
if err != nil {
feedback.Errorf("Storing config file: %v", err)
return err
feedback.Errorf("Error during config: storing config file: %v", err)
os.Exit(errorcodes.ErrGeneric)
}

fmt.Println("Configuration file updated")
return nil
logrus.Info("Configuration file updated")
}
37 changes: 30 additions & 7 deletions cli/device/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@ package device

import (
"fmt"
"os"

"github.com/arduino/arduino-cli/cli/errorcodes"
"github.com/arduino/arduino-cli/cli/feedback"
"github.com/arduino/iot-cloud-cli/command/device"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

Expand All @@ -18,7 +22,7 @@ func initCreateCommand() *cobra.Command {
Use: "create",
Short: "Create a device",
Long: "Create a device for Arduino IoT Cloud",
RunE: runCreateCommand,
Run: runCreateCommand,
}
createCommand.Flags().StringVarP(&createFlags.port, "port", "p", "", "Device port")
createCommand.Flags().StringVarP(&createFlags.name, "name", "n", "", "Device name")
Expand All @@ -27,8 +31,8 @@ func initCreateCommand() *cobra.Command {
return createCommand
}

func runCreateCommand(cmd *cobra.Command, args []string) error {
fmt.Printf("Creating device with name %s\n", createFlags.name)
func runCreateCommand(cmd *cobra.Command, args []string) {
logrus.Infof("Creating device with name %s\n", createFlags.name)

params := &device.CreateParams{
Name: createFlags.name,
Expand All @@ -40,11 +44,30 @@ func runCreateCommand(cmd *cobra.Command, args []string) error {
params.Fqbn = &createFlags.fqbn
}

devID, err := device.Create(params)
dev, err := device.Create(params)
if err != nil {
return err
feedback.Errorf("Error during device create: %v", err)
os.Exit(errorcodes.ErrGeneric)
}

fmt.Printf("IoT Cloud device created with ID: %s\n", devID)
return nil
feedback.PrintResult(createResult{dev})
}

type createResult struct {
device *device.DeviceInfo
}

func (r createResult) Data() interface{} {
return r.device
}

func (r createResult) String() string {
return fmt.Sprintf(
"name: %s\nid: %s\nboard: %s\nserial-number: %s\nfqbn: %s",
r.device.Name,
r.device.ID,
r.device.Board,
r.device.Serial,
r.device.FQBN,
)
}
17 changes: 10 additions & 7 deletions cli/device/delete.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package device

import (
"fmt"
"os"

"github.com/arduino/arduino-cli/cli/errorcodes"
"github.com/arduino/arduino-cli/cli/feedback"
"github.com/arduino/iot-cloud-cli/command/device"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

Expand All @@ -16,22 +19,22 @@ func initDeleteCommand() *cobra.Command {
Use: "delete",
Short: "Delete a device",
Long: "Delete a device from Arduino IoT Cloud",
RunE: runDeleteCommand,
Run: runDeleteCommand,
}
deleteCommand.Flags().StringVarP(&deleteFlags.id, "id", "i", "", "Device ID")
deleteCommand.MarkFlagRequired("id")
return deleteCommand
}

func runDeleteCommand(cmd *cobra.Command, args []string) error {
fmt.Printf("Deleting device %s\n", deleteFlags.id)
func runDeleteCommand(cmd *cobra.Command, args []string) {
logrus.Infof("Deleting device %s\n", deleteFlags.id)

params := &device.DeleteParams{ID: deleteFlags.id}
err := device.Delete(params)
if err != nil {
return err
feedback.Errorf("Error during device delete: %v", err)
os.Exit(errorcodes.ErrGeneric)
}

fmt.Println("Device successfully deleted")
return nil
logrus.Info("Device successfully deleted")
}
23 changes: 12 additions & 11 deletions cli/device/list.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package device

import (
"fmt"
"os"

"github.com/arduino/arduino-cli/cli/errorcodes"
"github.com/arduino/arduino-cli/cli/feedback"
"github.com/arduino/arduino-cli/table"
"github.com/arduino/iot-cloud-cli/command/device"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

Expand All @@ -14,33 +16,32 @@ func initListCommand() *cobra.Command {
Use: "list",
Short: "List devices",
Long: "List devices on Arduino IoT Cloud",
RunE: runListCommand,
Run: runListCommand,
}
return listCommand
}

func runListCommand(cmd *cobra.Command, args []string) error {
fmt.Println("Listing devices")
func runListCommand(cmd *cobra.Command, args []string) {
logrus.Info("Listing devices")

devs, err := device.List()
if err != nil {
return err
feedback.Errorf("Error during device list: %v", err)
os.Exit(errorcodes.ErrGeneric)
}

feedback.PrintResult(result{devs})

return nil
feedback.PrintResult(listResult{devs})
}

type result struct {
type listResult struct {
devices []device.DeviceInfo
}

func (r result) Data() interface{} {
func (r listResult) Data() interface{} {
return r.devices
}

func (r result) String() string {
func (r listResult) String() string {
if len(r.devices) == 0 {
return "No devices found."
}
Expand Down
22 changes: 0 additions & 22 deletions cli/root.go

This file was deleted.

Loading