internal/config/cspgenerator.go (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | package config
//go:generate go run ../../cmd/cspgenerator/
import (
"fmt"
"os"
"reflect"
"github.com/crewjam/csp"
"github.com/fatih/structtag"
"gitlab.com/tozd/go/errors"
)
func GenerateCSP() errors.E {
headerType := reflect.TypeFor[csp.Header]()
file, err := os.OpenFile("./csp.go", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0)
if err != nil {
return errors.WithMessage(err, "could not open file")
}
defer func() {
err := file.Close()
if err != nil {
panic("could not close file: " + err.Error())
}
}()
_, err = fmt.Fprintf(file, `package config
// Code generated DO NOT EDIT.
import (
"github.com/crewjam/csp"
)
type CSP struct {
`)
if err != nil {
return errors.WithMessage(err, "could not write to output")
}
for _, field := range reflect.VisibleFields(headerType) {
fieldType := field.Type
tags, err := structtag.Parse(string(field.Tag))
if err != nil {
return errors.WithMessage(err, "could not write to output")
}
cspTag, err := tags.Get("csp")
if err != nil {
return errors.WithMessage(err, "could not get csp tag")
}
err = tags.Set(&structtag.Tag{
Key: "toml",
Name: cspTag.Name,
})
if err != nil {
return errors.WithMessage(err, "could not set toml tag")
}
_, err = fmt.Fprintf(file, "\t%-23s %-28s `%s`\n", field.Name, fieldType, tags.String())
if err != nil {
return errors.WithMessage(err, "could not write to output")
}
}
_, err = fmt.Fprintln(file, "}")
if err != nil {
return errors.WithMessage(err, "could not write to output")
}
_, err = fmt.Fprintln(file, `
func (c *CSP) String() string {
return csp.Header(*c).String()
}`)
if err != nil {
return errors.WithMessage(err, "could not write to output")
}
return nil
}
|