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  }