b721b0a15c
To support accurate specification generation, this changeset includes a quick and dirty tool to generate a markdown table of error codes generated by the registry API. Equivalent supports for routes will likely follow. Exported descriptors could be used to generate other documentation, as well.
96 lines
2.0 KiB
Go
96 lines
2.0 KiB
Go
// registry-api-doctable-gen uses various descriptors within the registry code
|
|
// base to generate markdown tables for use in documentation. This is only
|
|
// meant to facilitate updates to documentation and not as an automated tool.
|
|
//
|
|
// For now, this only includes support for error codes:
|
|
//
|
|
// $ registry-api-doctable-gen errors
|
|
//
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"reflect"
|
|
"strings"
|
|
"text/tabwriter"
|
|
|
|
"github.com/docker/docker-registry/api/errors"
|
|
)
|
|
|
|
func main() {
|
|
|
|
if len(os.Args) < 2 {
|
|
log.Fatalln("please specify a table to generate: (errors)")
|
|
}
|
|
|
|
switch os.Args[1] {
|
|
case "errors":
|
|
dumpErrors(os.Stdout)
|
|
default:
|
|
log.Fatalln("unknown descriptor table:", os.Args[1])
|
|
}
|
|
|
|
}
|
|
|
|
func dumpErrors(wr io.Writer) {
|
|
writer := tabwriter.NewWriter(os.Stdout, 8, 8, 0, '\t', 0)
|
|
defer writer.Flush()
|
|
|
|
fmt.Fprint(writer, "|")
|
|
dtype := reflect.TypeOf(errors.ErrorDescriptor{})
|
|
var fieldsPrinted int
|
|
for i := 0; i < dtype.NumField(); i++ {
|
|
field := dtype.Field(i)
|
|
if field.Name == "Value" {
|
|
continue
|
|
}
|
|
|
|
fmt.Fprint(writer, field.Name, "|")
|
|
fieldsPrinted++
|
|
}
|
|
|
|
divider := strings.Repeat("-", 8)
|
|
var parts []string
|
|
for i := 0; i < fieldsPrinted; i++ {
|
|
parts = append(parts, divider)
|
|
}
|
|
divider = strings.Join(parts, "|")
|
|
|
|
fmt.Fprintln(writer, "\n"+divider)
|
|
|
|
for _, descriptor := range errors.Descriptors {
|
|
fmt.Fprint(writer, "|")
|
|
|
|
v := reflect.ValueOf(descriptor)
|
|
for i := 0; i < dtype.NumField(); i++ {
|
|
value := v.Field(i).Interface()
|
|
field := v.Type().Field(i)
|
|
if field.Name == "Value" {
|
|
continue
|
|
} else if field.Name == "Description" {
|
|
value = strings.Replace(value.(string), "\n", " ", -1)
|
|
} else if field.Name == "Code" {
|
|
value = fmt.Sprintf("`%s`", value)
|
|
} else if field.Name == "HTTPStatusCodes" {
|
|
if len(value.([]int)) > 0 {
|
|
var codes []string
|
|
for _, code := range value.([]int) {
|
|
codes = append(codes, fmt.Sprint(code))
|
|
}
|
|
value = strings.Join(codes, ", ")
|
|
} else {
|
|
value = "Any"
|
|
}
|
|
|
|
}
|
|
|
|
fmt.Fprint(writer, value, "|")
|
|
}
|
|
|
|
fmt.Fprint(writer, "\n")
|
|
}
|
|
}
|