github.com/wawandco/oxpecker@v1.5.7-0.20210910201653-5958d4afdd89/tools/soda/fizz/add_column.go (about) 1 package fizz 2 3 import ( 4 "fmt" 5 "regexp" 6 "strings" 7 8 "github.com/gobuffalo/flect" 9 ) 10 11 var acReg = regexp.MustCompile(`add(?:ing)?_\w+_to_(\w+)`) 12 13 type addColumn struct { 14 columns map[string]string 15 table string 16 } 17 18 func (ac addColumn) match(name string) bool { 19 return acReg.MatchString(name) 20 } 21 22 func (ac *addColumn) GenerateFizz(name string, args []string) (string, string, error) { 23 if len(args) == 0 { 24 return "", "", ErrNoColumnFound 25 } 26 27 matches := acReg.FindAllStringSubmatch(name, -1)[0][1:] 28 ac.columns = ac.parsecolumns(args) 29 ac.table = matches[0] 30 31 return ac.fizz(), ac.unFizz(), nil 32 } 33 34 func (ac addColumn) fizz() string { 35 var cols []string 36 37 for col, val := range ac.columns { 38 cols = append(cols, fmt.Sprintf(`add_column("%s", "%s", "%s", {})`, ac.table, col, val)) 39 } 40 41 return strings.Join(cols, "\n") 42 } 43 44 func (ac addColumn) unFizz() string { 45 var cols []string 46 47 for col := range ac.columns { 48 cols = append(cols, fmt.Sprintf(`drop_column("%s", "%s")`, ac.table, col)) 49 } 50 51 return strings.Join(cols, "\n") 52 } 53 54 func (ac *addColumn) parsecolumns(args []string) map[string]string { 55 cols := make(map[string]string) 56 57 for _, arg := range args { 58 slice := strings.Split(arg, ":") 59 if len(slice) == 1 { 60 slice = append(slice, "string") 61 } 62 63 name := flect.Underscore(slice[0]) 64 colType := columnType(slice[1]) 65 66 cols[name] = colType 67 } 68 69 return cols 70 }