github.com/kruftik/go-migrate@v3.5.4+incompatible/util.go (about)

     1  package migrate
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	nurl "net/url"
     7  	"strings"
     8  )
     9  
    10  // MultiError holds multiple errors.
    11  type MultiError struct {
    12  	Errs []error
    13  }
    14  
    15  // NewMultiError returns an error type holding multiple errors.
    16  func NewMultiError(errs ...error) MultiError {
    17  	compactErrs := make([]error, 0)
    18  	for _, e := range errs {
    19  		if e != nil {
    20  			compactErrs = append(compactErrs, e)
    21  		}
    22  	}
    23  	return MultiError{compactErrs}
    24  }
    25  
    26  // Error implements error. Mulitple errors are concatenated with 'and's.
    27  func (m MultiError) Error() string {
    28  	var strs = make([]string, 0)
    29  	for _, e := range m.Errs {
    30  		if len(e.Error()) > 0 {
    31  			strs = append(strs, e.Error())
    32  		}
    33  	}
    34  	return strings.Join(strs, " and ")
    35  }
    36  
    37  // suint safely converts int to uint
    38  // see https://goo.gl/wEcqof
    39  // see https://goo.gl/pai7Dr
    40  func suint(n int) uint {
    41  	if n < 0 {
    42  		panic(fmt.Sprintf("suint(%v) expects input >= 0", n))
    43  	}
    44  	return uint(n)
    45  }
    46  
    47  var errNoScheme = errors.New("no scheme")
    48  var errEmptyURL = errors.New("URL cannot be empty")
    49  
    50  func sourceSchemeFromUrl(url string) (string, error) {
    51  	u, err := schemeFromUrl(url)
    52  	if err != nil {
    53  		return "", fmt.Errorf("source: %v", err)
    54  	}
    55  	return u, nil
    56  }
    57  
    58  func databaseSchemeFromUrl(url string) (string, error) {
    59  	u, err := schemeFromUrl(url)
    60  	if err != nil {
    61  		return "", fmt.Errorf("database: %v", err)
    62  	}
    63  	return u, nil
    64  }
    65  
    66  // schemeFromUrl returns the scheme from a URL string
    67  func schemeFromUrl(url string) (string, error) {
    68  	if url == "" {
    69  		return "", errEmptyURL
    70  	}
    71  
    72  	u, err := nurl.Parse(url)
    73  	if err != nil {
    74  		return "", err
    75  	}
    76  	if len(u.Scheme) == 0 {
    77  		return "", errNoScheme
    78  	}
    79  
    80  	return u.Scheme, nil
    81  }
    82  
    83  // FilterCustomQuery filters all query values starting with `x-`
    84  func FilterCustomQuery(u *nurl.URL) *nurl.URL {
    85  	ux := *u
    86  	vx := make(nurl.Values)
    87  	for k, v := range ux.Query() {
    88  		if len(k) <= 1 || (len(k) > 1 && k[0:2] != "x-") {
    89  			vx[k] = v
    90  		}
    91  	}
    92  	ux.RawQuery = vx.Encode()
    93  	return &ux
    94  }