1
0
Fork 0
mirror of https://github.com/diamondburned/arikawa.git synced 2024-11-01 04:24:19 +00:00
arikawa/utils/gensnowflake/main.go
diamondburned d8438f3b51
discord: Refactor interactions and components
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.
2021-11-09 18:31:06 -08:00

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)
}
}