cmd/portr/cmd/export.go

// `portr export` — write a one-shot report to stdout in one of several formats.
//
// See mercemay.top/src/portr/ for context.
package cmd

import (
	"fmt"
	"os"

	"github.com/spf13/cobra"

	"github.com/mercemay/portr/internal/check"
	"github.com/mercemay/portr/internal/output"
	"github.com/mercemay/portr/internal/output/json"
	"github.com/mercemay/portr/internal/output/prometheus"
	"github.com/mercemay/portr/internal/output/table"
)

var exportFormat string

var exportCmd = &cobra.Command{
	Use:   "export",
	Short: "Write one report to stdout (table|json|prometheus)",
	RunE: func(cmd *cobra.Command, _ []string) error {
		cfg, err := loadConfig()
		if err != nil {
			return err
		}
		w, err := pickWriter(exportFormat)
		if err != nil {
			return err
		}
		rep, err := check.Run(cmd.Context(), cfg)
		if err != nil {
			return err
		}
		return w.Write(os.Stdout, rep)
	},
}

func init() {
	exportCmd.Flags().StringVarP(&exportFormat, "format", "f", "table", "table|json|prometheus")
}

func pickWriter(format string) (output.Writer, error) {
	switch format {
	case "table", "":
		return table.New(), nil
	case "json":
		return json.New(true), nil
	case "prometheus":
		return prometheus.New(""), nil
	default:
		return nil, fmt.Errorf("export: unknown format %q", format)
	}
}