diff --git a/cmd/RolesGenerator/main.go b/cmd/RolesGenerator/main.go index 28acee7..ed990f4 100644 --- a/cmd/RolesGenerator/main.go +++ b/cmd/RolesGenerator/main.go @@ -15,7 +15,11 @@ 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") + flagOutputFile = flag.String( + "output", + "", + "Specify the output file. If empty, writes to stdout", + ) ) func main() { @@ -82,7 +86,9 @@ func main() { // If you need to refresh the content, run go generate again `) outBuilder.WriteString(pkgString + "\n\n") - outBuilder.WriteString("import \"slices\"\n\n") + outBuilder.WriteString( + "import (\n \"slices\"\n \"gitlab.com/mstarongitlab/goutils/sliceutils\"\n)\n\n", + ) // Build role collapse function outBuilder.WriteString( @@ -113,7 +119,7 @@ func main() { `) // Then build the deep copy function - outBuilder.WriteString("\n\nfunc RoleDeepCopy(o *Role) Role {\n") + outBuilder.WriteString("\nfunc RoleDeepCopy(o *Role) Role {\n") outBuilder.WriteString(` n := Role{} n.Model = o.Model n.Name = o.Name @@ -132,7 +138,33 @@ func main() { `, valName, valName, valName, valName)) } } - outBuilder.WriteString(" return n\n}\n") + outBuilder.WriteString(" return n\n}\n\n") + + // Build compare function + outBuilder.WriteString("func CompareRoles(a, b *Role) bool {\n") + outBuilder.WriteString(" return ") + lastName, lastType := "", "" + for valName, valType := range nameTypeMap { + lastName = valName + lastType = valType + outBuilder.WriteString(fmt.Sprintf("(a.%s == nil || b.%s == nil || ", valName, valName)) + if strings.HasPrefix(valType, "[]") { + outBuilder.WriteString( + fmt.Sprintf("sliceutils.CompareUnordered(a.%s,b.%s)) && ", valName, valName), + ) + } else { + outBuilder.WriteString(fmt.Sprintf("a.%s == b.%s) && ", valName, valName)) + } + } + outBuilder.WriteString("(a == nil || b == nil || ") + if strings.HasPrefix(lastType, "[]") { + outBuilder.WriteString( + fmt.Sprintf("sliceutils.CompareUnordered(a.%s,b.%s))", lastName, lastName), + ) + } else { + outBuilder.WriteString(fmt.Sprintf("a.%s == b.%s)", lastName, lastName)) + } + outBuilder.WriteString("\n}") // And write the entire thing to the output fmt.Fprint(output, outBuilder.String())