|
|
|
@@ -3,7 +3,9 @@ package bfcodegen
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
"gogs.mikescher.com/BlackForestBytes/goext"
|
|
|
|
|
"gogs.mikescher.com/BlackForestBytes/goext/cmdext"
|
|
|
|
|
"gogs.mikescher.com/BlackForestBytes/goext/cryptext"
|
|
|
|
|
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
|
|
|
|
"gogs.mikescher.com/BlackForestBytes/goext/rext"
|
|
|
|
|
"io"
|
|
|
|
@@ -32,6 +34,8 @@ var rexEnumDef = rext.W(regexp.MustCompile("^\\s*type\\s+(?P<name>[A-Za-z0-9_]+)
|
|
|
|
|
|
|
|
|
|
var rexValueDef = rext.W(regexp.MustCompile("^\\s*(?P<name>[A-Za-z0-9_]+)\\s+(?P<type>[A-Za-z0-9_]+)\\s*=\\s*(?P<value>(\"[A-Za-z0-9_:]+\"|[0-9]+))\\s*(//(?P<descr>.*))?.*$"))
|
|
|
|
|
|
|
|
|
|
var rexChecksumConst = rext.W(regexp.MustCompile("const ChecksumGenerator = \"(?P<cs>[A-Za-z0-9_]*)\""))
|
|
|
|
|
|
|
|
|
|
func GenerateEnumSpecs(sourceDir string, destFile string) error {
|
|
|
|
|
|
|
|
|
|
files, err := os.ReadDir(sourceDir)
|
|
|
|
@@ -39,6 +43,36 @@ func GenerateEnumSpecs(sourceDir string, destFile string) error {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
oldChecksum := "N/A"
|
|
|
|
|
if _, err := os.Stat(destFile); !os.IsNotExist(err) {
|
|
|
|
|
content, err := os.ReadFile(destFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if m, ok := rexChecksumConst.MatchFirst(string(content)); ok {
|
|
|
|
|
oldChecksum = m.GroupByName("cs").Value()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
newChecksumStr := goext.GoextVersion
|
|
|
|
|
langext.SortBy(files, func(v os.DirEntry) string { return v.Name() })
|
|
|
|
|
for _, f := range files {
|
|
|
|
|
content, err := os.ReadFile(destFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
newChecksumStr += "\n" + f.Name() + "\t" + cryptext.BytesSha256(content)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
newChecksum := cryptext.BytesSha256([]byte(newChecksumStr))
|
|
|
|
|
|
|
|
|
|
if newChecksum != oldChecksum {
|
|
|
|
|
fmt.Printf("[EnumGenerate] Checksum has changed ( %s -> %s ), will generate new file\n\n", oldChecksum, newChecksum)
|
|
|
|
|
} else {
|
|
|
|
|
fmt.Printf("[EnumGenerate] Checksum unchanged ( %s ), nothing to do\n", oldChecksum)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
allEnums := make([]EnumDef, 0)
|
|
|
|
|
|
|
|
|
|
pkgname := ""
|
|
|
|
@@ -67,7 +101,7 @@ func GenerateEnumSpecs(sourceDir string, destFile string) error {
|
|
|
|
|
return errors.New("no package name found in any file")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = os.WriteFile(destFile, []byte(fmtOutput(allEnums, pkgname)), 0o755)
|
|
|
|
|
err = os.WriteFile(destFile, []byte(fmtOutput(newChecksum, allEnums, pkgname)), 0o755)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
@@ -159,8 +193,8 @@ func processFile(fn string) ([]EnumDef, string, error) {
|
|
|
|
|
return enums, pkgname, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func fmtOutput(enums []EnumDef, pkgname string) string {
|
|
|
|
|
str := "// Code generated by permissions_gen.sh DO NOT EDIT.\n"
|
|
|
|
|
func fmtOutput(cs string, enums []EnumDef, pkgname string) string {
|
|
|
|
|
str := "// Code generated by enum-generate.go DO NOT EDIT.\n"
|
|
|
|
|
str += "\n"
|
|
|
|
|
str += "package " + pkgname + "\n"
|
|
|
|
|
str += "\n"
|
|
|
|
@@ -168,6 +202,9 @@ func fmtOutput(enums []EnumDef, pkgname string) string {
|
|
|
|
|
str += "import \"gogs.mikescher.com/BlackForestBytes/goext/langext\"" + "\n"
|
|
|
|
|
str += "\n"
|
|
|
|
|
|
|
|
|
|
str += "const ChecksumGenerator = \"" + cs + "\"" + "\n"
|
|
|
|
|
str += "\n"
|
|
|
|
|
|
|
|
|
|
str += "type Enum interface {" + "\n"
|
|
|
|
|
str += " Valid() bool" + "\n"
|
|
|
|
|
str += " ValuesAny() []any" + "\n"
|
|
|
|
|