1package main 2 3import ( 4 "bytes" 5 "fmt" 6 "os" 7 8 "github.com/lestrrat-go/codegen" 9 "github.com/pkg/errors" 10) 11 12type definition struct { 13 Filename string 14 Package string 15 ReturnType string 16 ParseOptions bool 17} 18 19func main() { 20 if err := _main(); err != nil { 21 fmt.Fprintf(os.Stderr, "%s\n", err) 22 os.Exit(1) 23 } 24} 25 26func _main() error { 27 definitions := []definition{ 28 { 29 Package: "jwk", 30 ReturnType: "Set", 31 Filename: "jwk/io.go", 32 ParseOptions: true, 33 }, 34 { 35 Package: "jws", 36 ReturnType: "*Message", 37 Filename: "jws/io.go", 38 }, 39 { 40 Package: "jwe", 41 ReturnType: "*Message", 42 Filename: "jwe/io.go", 43 }, 44 { 45 Package: "jwt", 46 ReturnType: "Token", 47 Filename: "jwt/io.go", 48 ParseOptions: true, 49 }, 50 } 51 52 for _, def := range definitions { 53 if err := generateFile(def); err != nil { 54 return err 55 } 56 } 57 return nil 58} 59 60func generateFile(def definition) error { 61 var buf bytes.Buffer 62 o := codegen.NewOutput(&buf) 63 64 o.LL("// Automatically generated by internal/cmd/genreadfile/main.go. DO NOT EDIT") 65 o.LL("package %s", def.Package) 66 67 o.LL("// ReadFileOption describes options that can be passed to ReadFile.") 68 if !def.ParseOptions { 69 o.L("// Currently there are no options available that can be passed to ReadFile, but") 70 o.L("// it is provided here for anticipated future additions") 71 } 72 o.L("type ReadFileOption interface {") 73 o.L("Option") 74 o.L("readFileOption()") 75 o.L("}") 76 77 if !def.ParseOptions { 78 o.L("func ReadFile(path string, _ ...ReadFileOption) (%s, error) {", def.ReturnType) 79 } else { 80 o.L("func ReadFile(path string, options ...ReadFileOption) (%s, error) {", def.ReturnType) 81 o.L("var parseOptions []ParseOption") 82 o.L("for _, option := range options {") 83 o.L("switch option := option.(type) {") 84 o.L("case ParseOption:") 85 o.L("parseOptions = append(parseOptions, option)") 86 o.L("}") 87 o.L("}") 88 o.L("") 89 } 90 o.L("f, err := os.Open(path)") 91 o.L("if err != nil {") 92 o.L("return nil, err") 93 o.L("}") 94 o.LL("defer f.Close()") 95 if def.ParseOptions { 96 o.L("return ParseReader(f, parseOptions...)") 97 } else { 98 o.L("return ParseReader(f)") 99 } 100 o.L("}") 101 if err := o.WriteFile(def.Filename, codegen.WithFormatCode(true)); err != nil { 102 if cfe, ok := err.(codegen.CodeFormatError); ok { 103 fmt.Fprint(os.Stderr, cfe.Source()) 104 } 105 return errors.Wrapf(err, `failed to write to %s`, def.Filename) 106 } 107 return nil 108} 109