mirror of
https://github.com/diamondburned/arikawa.git
synced 2024-11-01 04:24:19 +00:00
d8438f3b51
This commit gets rid of contain-it-all structs and instead opt for interface union types containing underlying concrete types with no overloading. The code is much more verbose by doing this, but the API is much nicer to use. The only disadvantage in that regard is the interface assertion being too verbose and risky for users at times.
87 lines
1.4 KiB
Go
87 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"flag"
|
|
"go/format"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"text/template"
|
|
|
|
_ "embed"
|
|
)
|
|
|
|
type data struct {
|
|
Package string
|
|
ImportDiscord bool
|
|
Snowflakes []snowflakeType
|
|
}
|
|
|
|
type snowflakeType struct {
|
|
TypeName string
|
|
}
|
|
|
|
//go:embed template.tmpl
|
|
var packageTmpl string
|
|
|
|
var tmpl = template.Must(template.New("").Parse(packageTmpl))
|
|
|
|
func main() {
|
|
var pkg string
|
|
var out string
|
|
|
|
log.SetFlags(0)
|
|
|
|
flag.Usage = func() {
|
|
log.Printf("usage: %s [-p package] <type names...>", filepath.Base(os.Args[0]))
|
|
flag.PrintDefaults()
|
|
}
|
|
|
|
flag.StringVar(&out, "o", "", "output, empty for stdout")
|
|
flag.StringVar(&pkg, "p", "discord", "package name")
|
|
flag.Parse()
|
|
|
|
if len(flag.Args()) == 0 {
|
|
flag.Usage()
|
|
os.Exit(1)
|
|
}
|
|
|
|
d := data{
|
|
Package: pkg,
|
|
ImportDiscord: pkg != "discord",
|
|
}
|
|
|
|
for _, arg := range flag.Args() {
|
|
d.Snowflakes = append(d.Snowflakes, snowflakeType{
|
|
TypeName: arg,
|
|
})
|
|
}
|
|
|
|
buf := bytes.Buffer{}
|
|
if err := tmpl.Execute(&buf, d); err != nil {
|
|
log.Fatalln("failed to execute template:", err)
|
|
}
|
|
|
|
b, err := format.Source(buf.Bytes())
|
|
if err != nil {
|
|
log.Fatalln("failed to fmt:", err)
|
|
}
|
|
|
|
outFile := os.Stdout
|
|
|
|
if out != "" {
|
|
f, err := os.Create(out)
|
|
if err != nil {
|
|
log.Fatalln("failed to create output file:", err)
|
|
}
|
|
defer f.Close()
|
|
|
|
outFile = f
|
|
}
|
|
|
|
if _, err := outFile.Write(b); err != nil {
|
|
log.Fatalln("failed to write to file:", err)
|
|
}
|
|
}
|