Work on
This commit is contained in:
parent
a8abfb2219
commit
25243b3a9d
3 changed files with 113 additions and 5 deletions
103
cmd/RolesApiConverter/main.go
Normal file
103
cmd/RolesApiConverter/main.go
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
Tool for auto-generating API helper functions in regards to roles
|
||||||
|
*/
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"gitlab.com/mstarongitlab/goutils/sliceutils"
|
||||||
|
)
|
||||||
|
|
||||||
|
var findRoleStructRegex = regexp.MustCompile(`type Role struct \{([\s\S]+)\}\n\n/\*`)
|
||||||
|
|
||||||
|
var (
|
||||||
|
flagInputFile = flag.String("input", "", "Specify the input file. If empty, read from stdin")
|
||||||
|
flagOutputFile = flag.String(
|
||||||
|
"output",
|
||||||
|
"",
|
||||||
|
"Specify the output file. If empty, writes to stdout",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
var input io.Reader
|
||||||
|
var output io.Writer
|
||||||
|
|
||||||
|
if *flagInputFile == "" {
|
||||||
|
input = os.Stdin
|
||||||
|
} else {
|
||||||
|
file, err := os.Open(*flagInputFile)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
input = file
|
||||||
|
}
|
||||||
|
if *flagOutputFile == "" {
|
||||||
|
output = os.Stdout
|
||||||
|
} else {
|
||||||
|
file, err := os.Create(*flagOutputFile)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
output = file
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := io.ReadAll(input)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if !findRoleStructRegex.Match(data) {
|
||||||
|
panic("Input doesn't contain role struct")
|
||||||
|
}
|
||||||
|
content := findRoleStructRegex.FindStringSubmatch(string(data))[1]
|
||||||
|
lines := strings.Split(content, "\n")
|
||||||
|
lines = sliceutils.Map(lines, func(t string) string { return strings.TrimSpace(t) })
|
||||||
|
importantLines := sliceutils.Filter(lines, func(t string) bool {
|
||||||
|
if strings.HasPrefix(t, "//") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if strings.Contains(t, "gorm.Model") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
data := sliceutils.Filter(strings.Split(t, " "), func(t string) bool { return t != "" })
|
||||||
|
if len(data) < 2 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if !strings.HasPrefix(data[1], "*") && !strings.HasPrefix(data[1], "[]") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
nameTypeMap := map[string]string{}
|
||||||
|
for _, line := range importantLines {
|
||||||
|
parts := sliceutils.Filter(strings.Split(line, " "), func(t string) bool { return t != "" })
|
||||||
|
nameTypeMap[parts[0]] = parts[1]
|
||||||
|
}
|
||||||
|
pkgString, _, _ := strings.Cut(string(data), "\n")
|
||||||
|
|
||||||
|
outBuilder := strings.Builder{}
|
||||||
|
outBuilder.WriteString(`// Code generated by cmd/RolesApiConverter DO NOT EDIT.
|
||||||
|
// If you need to refresh the content, run go generate again
|
||||||
|
`)
|
||||||
|
outBuilder.WriteString(pkgString + "\n\n")
|
||||||
|
|
||||||
|
outBuilder.WriteString("func convertStorageRoleToApiRole(r storage.Role) linstromRole {\n")
|
||||||
|
outBuilder.WriteString("return linstromRole{")
|
||||||
|
outBuilder.WriteString("Id:r.ID,CreatedAt:r.CreatedAt,UpdatedAt:&r.UpdatedAt,Name:r.Name,")
|
||||||
|
outBuilder.WriteString("Priority:r.Priority,IsUserRole:r.IsUserRole,IsBuiltIn:r.IsBuiltIn,")
|
||||||
|
for k := range nameTypeMap {
|
||||||
|
outBuilder.WriteString(fmt.Sprintf("%s:r.%s,", k, k))
|
||||||
|
}
|
||||||
|
outBuilder.WriteString("}\n}\n")
|
||||||
|
|
||||||
|
fmt.Fprint(output, outBuilder.String())
|
||||||
|
}
|
|
@ -1,3 +1,12 @@
|
||||||
|
/*
|
||||||
|
Tool for generating helper functions for storage.Role structs inside of the storage package
|
||||||
|
It generates the following functions:
|
||||||
|
- CollapseRolesIntoOne: Collapse a list of roles into one singular role. Each value will be set to the
|
||||||
|
value of the role with the highest priority
|
||||||
|
- RoleDeepCopy: Copy a role, including all arrays. Every value will be copied too
|
||||||
|
- CompareRoles: Compare two roles. Returns true only if all fields are equal
|
||||||
|
(if one of the fields is nil, that field is seen as equal)
|
||||||
|
*/
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
@ -6,10 +6,6 @@ import "time"
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ = linstromNote{}
|
_ = linstromNote{}
|
||||||
_ = linstromOriginServer{}
|
|
||||||
_ = linstromMediaMetadata{}
|
|
||||||
_ = linstromAccount{}
|
|
||||||
_ = linstromCustomAccountField{}
|
|
||||||
_ = linstromRole{}
|
_ = linstromRole{}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -108,7 +104,7 @@ type linstromRole struct {
|
||||||
// If two roles have the same priority, the order is undetermined and may be random
|
// If two roles have the same priority, the order is undetermined and may be random
|
||||||
// Default priority for new roles is 1 to always overwrite default user
|
// Default priority for new roles is 1 to always overwrite default user
|
||||||
// And full admin has max priority possible
|
// And full admin has max priority possible
|
||||||
Priority uint `jsonapi:"attr,priority"`
|
Priority uint32 `jsonapi:"attr,priority"`
|
||||||
// Whether this role is for a for a single user only (like custom, per user permissions in Discord)
|
// Whether this role is for a for a single user only (like custom, per user permissions in Discord)
|
||||||
// If yes, Name will be the id of the user in question
|
// If yes, Name will be the id of the user in question
|
||||||
IsUserRole bool `jsonapi:"attr,is-user-role"`
|
IsUserRole bool `jsonapi:"attr,is-user-role"`
|
||||||
|
|
Loading…
Reference in a new issue