97 lines
2 KiB
Go
97 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
|
||
|
}
|