github.com/wawandco/oxpecker@v1.5.7-0.20210910201653-5958d4afdd89/tools/soda/fizz/rename.go (about) 1 package fizz 2 3 import ( 4 "fmt" 5 "regexp" 6 "strings" 7 8 "github.com/pkg/errors" 9 ) 10 11 var ErrInvalidRenamer error = errors.New("invalid renamer, please write a valid argument") 12 13 type rename struct { 14 newName string 15 oldName string 16 table string 17 renType string 18 } 19 20 func (rt rename) match(name string) bool { 21 return strings.HasPrefix(name, "rename") 22 } 23 24 func (rt *rename) GenerateFizz(name string, args []string) (string, string, error) { 25 var up, down string 26 var reg *regexp.Regexp 27 28 isTable := strings.HasPrefix(name, "rename_table") 29 isColumn := strings.HasPrefix(name, "rename_column") 30 isIndex := strings.HasPrefix(name, "rename_index") 31 32 if isTable { 33 reg = regexp.MustCompile(`rename_table_(\w+)_to_(\w+)`) 34 rt.renType = "table" 35 } 36 37 if isColumn { 38 reg = regexp.MustCompile(`rename_column_(\w+)_to_(\w+)_from_(\w+)`) 39 rt.renType = "column" 40 } 41 42 if isIndex { 43 reg = regexp.MustCompile(`rename_index_(\w+)_to_(\w+)_from_(\w+)`) 44 rt.renType = "index" 45 } 46 47 if reg == nil { 48 return up, down, ErrInvalidRenamer 49 } 50 51 if !reg.MatchString(name) { 52 return up, down, ErrInvalidRenamer 53 } 54 55 matches := reg.FindAllStringSubmatch(name, -1)[0][1:] 56 rt.oldName = matches[0] 57 rt.newName = matches[1] 58 59 if len(matches) == 3 { 60 rt.table = matches[2] 61 } 62 63 up = rt.fizz() 64 down = rt.unFizz() 65 66 return up, down, nil 67 } 68 69 func (rt rename) fizz() string { 70 switch rt.renType { 71 case "column": 72 return fmt.Sprintf(`rename_column("%s", "%s", "%s")`, rt.table, rt.oldName, rt.newName) 73 case "index": 74 return fmt.Sprintf(`rename_index("%s", "%s", "%s")`, rt.table, rt.oldName, rt.newName) 75 default: 76 return fmt.Sprintf(`rename_table("%s", "%s")`, rt.oldName, rt.newName) 77 } 78 } 79 80 func (rt rename) unFizz() string { 81 switch rt.renType { 82 case "column": 83 return fmt.Sprintf(`rename_column("%s", "%s", "%s")`, rt.table, rt.newName, rt.oldName) 84 case "index": 85 return fmt.Sprintf(`rename_index("%s", "%s", "%s")`, rt.table, rt.newName, rt.oldName) 86 default: 87 return fmt.Sprintf(`rename_table("%s", "%s")`, rt.newName, rt.oldName) 88 } 89 }