github.com/Odesyuk/pop@v4.13.1+incompatible/fix/anko.go (about)

     1  package fix
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"regexp"
     7  	"strings"
     8  
     9  	"github.com/gobuffalo/plush"
    10  )
    11  
    12  // Anko converts old anko-form migrations to new plush ones.
    13  func Anko(content string) (string, error) {
    14  	bb := &bytes.Buffer{}
    15  
    16  	lines := strings.Split(content, "\n")
    17  	l := len(lines)
    18  	fre := regexp.MustCompile(`,\s*func\(t\)\s*{`)
    19  
    20  	for i := 0; i < l; i++ {
    21  		line := lines[i]
    22  		tl := strings.TrimSpace(line)
    23  		if strings.HasPrefix(tl, "create_table") {
    24  			// skip already converted create_table
    25  			if fre.MatchString(line) {
    26  				// fix create_table
    27  				line = fre.ReplaceAllString(line, ") {")
    28  				ll := i
    29  				lines[i] = line
    30  				waitParen := false
    31  				for {
    32  					if strings.HasPrefix(tl, "})") {
    33  						line = "}" + tl[2:]
    34  						break
    35  					} else if strings.HasPrefix(tl, "}") {
    36  						// Now, we have to make sure to match the missing ")"
    37  						waitParen = true
    38  					} else if waitParen && strings.HasPrefix(tl, ")") {
    39  						line = tl[1:]
    40  						break
    41  					}
    42  					i++
    43  					if l == i {
    44  						return "", fmt.Errorf("unclosed create_table statement line %d", ll+1)
    45  					}
    46  					line = lines[i]
    47  					tl = strings.TrimSpace(line)
    48  				}
    49  			}
    50  		} else if strings.HasPrefix(tl, "raw(") {
    51  			// fix raw
    52  			line = strings.Replace(line, "raw(", "sql(", -1)
    53  		}
    54  		lines[i] = line
    55  	}
    56  
    57  	body := strings.Join(lines, "\n")
    58  
    59  	if _, err := plush.Parse(body); err != nil {
    60  		return "", err
    61  	}
    62  
    63  	bb.WriteString(body)
    64  
    65  	return bb.String(), nil
    66  }