// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package command

import (
	"encoding/json"
	"fmt"
	"strings"
)

// Format some raw data for output. For better or worse, this currently forces
// the passed data object to implement fmt.Stringer, since it's pretty hard to
// implement a canonical *-to-string function.
func formatOutput(data interface{}, format string) ([]byte, error) {
	var out string

	switch format {

	case "json":
		jsonout, err := json.MarshalIndent(data, "", "  ")
		if err != nil {
			return nil, err
		}
		out = string(jsonout)

	case "text":
		out = data.(fmt.Stringer).String()

	default:
		return nil, fmt.Errorf("Invalid output format \"%s\"", format)

	}
	return []byte(prepareOutput(out)), nil
}

// Apply some final formatting to make sure we don't end up with extra newlines
func prepareOutput(in string) string {
	return strings.TrimSpace(string(in))
}
