github.com/wawandco/oxpecker@v1.5.7-0.20210910201653-5958d4afdd89/tools/soda/fizz/change_column.go (about) 1 package fizz 2 3 import ( 4 "fmt" 5 "regexp" 6 "strings" 7 ) 8 9 var ccReg = regexp.MustCompile(`change_(\w+)_(\w+)`) 10 11 type changeColumn struct { 12 column string 13 newColType string 14 table string 15 isNull bool 16 } 17 18 func (cc changeColumn) match(name string) bool { 19 return ccReg.MatchString(name) 20 } 21 22 func (cc *changeColumn) GenerateFizz(name string, args []string) (string, string, error) { 23 if len(args) == 0 { 24 return "", "", ErrNoColumnFound 25 } 26 27 matches := ccReg.FindAllStringSubmatch(name, -1)[0][1:] 28 cc.table = matches[0] 29 cc.column = matches[1] 30 cc.newColType = columnType(args[0]) 31 cc.isNull = strings.Contains(args[0], "nulls") 32 33 return cc.fizz(), cc.unFizz(), nil 34 } 35 36 func (cc changeColumn) fizz() string { 37 return fmt.Sprintf(`change_column("%s", "%s", "%s", {%s})`, cc.table, cc.column, cc.newColType, cc.parseNull()) 38 } 39 40 func (cc changeColumn) unFizz() string { 41 return fmt.Sprintf(`change_column("%s", "%s", "string", {})`, cc.table, cc.column) 42 } 43 44 func (cc changeColumn) parseNull() string { 45 if !cc.isNull { 46 return "" 47 } 48 49 return "null: true" 50 }