feat: json output formatter
This commit is contained in:
28
cmd/verbs.go
28
cmd/verbs.go
@ -2,8 +2,8 @@ package cmd
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"log/slog"
|
||||
"os"
|
||||
"slices"
|
||||
@ -11,6 +11,7 @@ import (
|
||||
|
||||
"git.bissendorf.co/bissendorf/unifood/m/v2/core/interfaces"
|
||||
"git.bissendorf.co/bissendorf/unifood/m/v2/core/interfaces/params"
|
||||
"git.bissendorf.co/bissendorf/unifood/m/v2/core/output"
|
||||
"git.bissendorf.co/bissendorf/unifood/m/v2/core/services/jlog"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
@ -19,32 +20,47 @@ type VerbItem struct {
|
||||
Name interfaces.Verb
|
||||
Aliases []string
|
||||
Description string
|
||||
RunFn func(ctx context.Context, handler interfaces.ResourceHandler, params params.Container) error
|
||||
RunFn func(ctx context.Context, config AppConfig, handler interfaces.ResourceHandler, params params.Container) error
|
||||
}
|
||||
|
||||
var verbs = []VerbItem{
|
||||
{
|
||||
Name: interfaces.VerbGet,
|
||||
Description: "Retrieve resource information",
|
||||
RunFn: func(ctx context.Context, handler interfaces.ResourceHandler, params params.Container) error {
|
||||
RunFn: func(ctx context.Context, config AppConfig, handler interfaces.ResourceHandler, params params.Container) error {
|
||||
h, ok := handler.(interfaces.GetHandler)
|
||||
if !ok {
|
||||
return fmt.Errorf("resource does not support GET")
|
||||
}
|
||||
|
||||
// Get item
|
||||
item, err := h.Get(ctx, params)
|
||||
if err != nil {
|
||||
return fmt.Errorf("retrieving item failed: %w", err)
|
||||
}
|
||||
|
||||
json.NewEncoder(os.Stdout).Encode(item)
|
||||
formatterName := strings.ToLower(config.OutputMode)
|
||||
formatter, exists := output.Formatters[formatterName]
|
||||
if !exists {
|
||||
return fmt.Errorf("could not find output formatter '%s'", formatterName)
|
||||
}
|
||||
|
||||
// Format and output
|
||||
formatted, err := formatter.Format(item)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to format output: %w", err)
|
||||
}
|
||||
_, err = io.Copy(os.Stdout, formatted)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to write output: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func getVerbs(ctx context.Context) (commands []*cobra.Command) {
|
||||
func getVerbs(ctx context.Context, config AppConfig) (commands []*cobra.Command) {
|
||||
logger := jlog.FromContext(ctx)
|
||||
|
||||
for _, v := range verbs {
|
||||
@ -69,7 +85,7 @@ func getVerbs(ctx context.Context) (commands []*cobra.Command) {
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
logger := jlog.New(slog.LevelInfo)
|
||||
ctx := jlog.ContextWith(context.Background(), logger)
|
||||
err := v.RunFn(ctx, r.Handler, params)
|
||||
err := v.RunFn(ctx, config, r.Handler, params)
|
||||
if err != nil {
|
||||
logger.ErrorContext(ctx, fmt.Sprintf("%s %s failed", strings.ToUpper(string(v.Name)), r.Name), "error", err.Error())
|
||||
os.Exit(1)
|
||||
|
||||
Reference in New Issue
Block a user