Path: blob/main/dev/gpctl/pkg/prettyprint/prettyprint.go
2500 views
// Copyright (c) 2020 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package prettyprint56import (7"encoding/json"8"fmt"9"html/template"10"io"11"text/tabwriter"1213"github.com/Masterminds/sprig"14"golang.org/x/xerrors"15"k8s.io/client-go/util/jsonpath"16)1718// Format defines how to print an object19type Format string2021const (22// StringFormat prints an object as repr string23StringFormat Format = "string"2425// JSONPathFormat extracts info using jsonpath26JSONPathFormat Format = "jsonpath"2728// TemplateFormat prints info using a Go template29TemplateFormat Format = "tpl"3031// JSONFormat prints an object as JSON32JSONFormat Format = "json"33)3435type formatterFunc func(*Printer, interface{}) error3637var formatter = map[Format]formatterFunc{38StringFormat: formatString,39TemplateFormat: formatTemplate,40JSONFormat: formatJSON,41JSONPathFormat: formatJSONPath,42}4344func formatString(pp *Printer, obj interface{}) error {45_, err := fmt.Fprintf(pp.Writer, "%s", obj)46return err47}4849func formatJSONPath(pp *Printer, obj interface{}) error {50p := jsonpath.New("expr")51if err := p.Parse(pp.Template); err != nil {52return err53}54return p.Execute(pp.Writer, obj)55}5657func formatTemplate(pp *Printer, obj interface{}) error {58tmpl, err := template.New("prettyprint").Funcs(sprig.FuncMap()).Parse(pp.Template)59if err != nil {60return err61}6263w := tabwriter.NewWriter(pp.Writer, 8, 8, 8, ' ', 0)64if err := tmpl.Execute(w, obj); err != nil {65return err66}67if err := w.Flush(); err != nil {68return err69}70return nil71}7273func formatJSON(pp *Printer, obj interface{}) error {74enc := json.NewEncoder(pp.Writer)75enc.SetIndent("", " ")76return enc.Encode(obj)77}7879// Printer is pretty-printer80type Printer struct {81Format Format82Writer io.Writer83Template string84}8586// Print pretty-prints the content87func (pp *Printer) Print(obj interface{}) error {88formatter, ok := formatter[pp.Format]89if !ok {90return xerrors.Errorf("Unknown format: %s", pp.Format)91}9293return formatter(pp, obj)94}959697