2014-12-11 00:21:12 +00:00
|
|
|
// 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)
|
|
|
|
|
2014-12-12 06:04:26 +00:00
|
|
|
for _, descriptor := range errors.ErrorDescriptors {
|
2014-12-11 00:21:12 +00:00
|
|
|
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")
|
|
|
|
}
|
|
|
|
}
|