6aec17d079
Reviewed-on: #16
82 lines
1.5 KiB
Go
82 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
"os"
|
|
|
|
"github.com/spf13/cobra"
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
// Encoder represents an object that encodes another internally
|
|
type Encoder interface {
|
|
Encode(any) error
|
|
}
|
|
|
|
// Encoding represents a type of [Encoder]
|
|
type Encoding int
|
|
|
|
const (
|
|
// UndefinedEncoding implies the default encoding
|
|
UndefinedEncoding Encoding = iota
|
|
// JSONEncoding represents JSON encoding
|
|
JSONEncoding
|
|
// YAMLEncoding represents YAML encoding
|
|
YAMLEncoding
|
|
)
|
|
|
|
// NewJSONEncoder returns a JSON [Encoder] to work on the given [io.Writer]
|
|
func NewJSONEncoder(w io.Writer) Encoder {
|
|
enc := json.NewEncoder(w)
|
|
enc.SetIndent(``, ` `)
|
|
return enc
|
|
}
|
|
|
|
// NewYAMLEncoder returns a YAML [Encoder] to work on the given [io.Writer]
|
|
func NewYAMLEncoder(w io.Writer) Encoder {
|
|
enc := yaml.NewEncoder(w)
|
|
enc.SetIndent(2)
|
|
return enc
|
|
}
|
|
|
|
const encoding = YAMLEncoding
|
|
|
|
// Command
|
|
var dumpCmd = &cobra.Command{
|
|
Use: "dump",
|
|
Short: "generates a text representation of the config",
|
|
PreRun: setVerbosity,
|
|
RunE: func(_ *cobra.Command, _ []string) error {
|
|
var buf bytes.Buffer
|
|
var enc Encoder
|
|
|
|
m, err := cfg.LoadZones(true)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
switch encoding {
|
|
case JSONEncoding:
|
|
enc = NewJSONEncoder(&buf)
|
|
default:
|
|
enc = NewYAMLEncoder(&buf)
|
|
}
|
|
|
|
if err = enc.Encode(m); err != nil {
|
|
return err
|
|
}
|
|
|
|
if _, err = buf.WriteTo(os.Stdout); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(dumpCmd)
|
|
}
|