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  }