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