/* 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] } 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("package server\n\n") outBuilder.WriteString("import \"gitlab.com/mstarongitlab/linstrom/storage\"\n") outBuilder.WriteString("func convertRoleStorageToLinstrom(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()) }