dex/cmd/gendoc/main.go
2016-02-01 16:09:23 -08:00

96 lines
2 KiB
Go

package main
import (
"fmt"
"io"
"os"
"github.com/coreos/dex/pkg/gendoc"
"github.com/spf13/cobra"
)
var cmd = &cobra.Command{
Use: "gendoc",
Short: "Generate documentation from REST specifications.",
Long: `A tool to generate documentation for dex's REST APIs.`,
RunE: gen,
}
var (
infile string
outfile string
readFlavor string
writeFlavor string
)
func init() {
cmd.PersistentFlags().StringVar(&infile, "f", "", "File to read from. If ommitted read from stdin.")
cmd.PersistentFlags().StringVar(&outfile, "o", "", "File to write to. If ommitted write to stdout.")
cmd.PersistentFlags().StringVar(&readFlavor, "r", "googleapi", "Flavor of REST spec to read. Currently only supports 'googleapi'.")
cmd.PersistentFlags().StringVar(&writeFlavor, "w", "markdown", "Flavor of documentation. Currently only supports 'markdown'.")
}
func main() {
if err := cmd.Execute(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(2)
}
}
func gen(cmd *cobra.Command, args []string) error {
var (
in io.Reader
out io.Writer
decode func(io.Reader) (gendoc.Document, error)
encode func(gendoc.Document) ([]byte, error)
)
switch readFlavor {
case "googleapi":
decode = gendoc.ParseGoogleAPI
default:
return fmt.Errorf("unsupported read flavor %q", readFlavor)
}
switch writeFlavor {
case "markdown":
encode = gendoc.Document.MarshalMarkdown
default:
return fmt.Errorf("unsupported write flavor %q", writeFlavor)
}
if infile == "" {
in = os.Stdin
} else {
f, err := os.OpenFile(infile, os.O_RDONLY, 0644)
if err != nil {
return err
}
defer f.Close()
in = f
}
if outfile == "" {
out = os.Stdout
} else {
f, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
return err
}
defer f.Close()
out = f
}
doc, err := decode(in)
if err != nil {
return fmt.Errorf("failed to decode input: %v", err)
}
data, err := encode(doc)
if err != nil {
return fmt.Errorf("failed to encode document: %v", err)
}
_, err = out.Write(data)
return err
}