github.com/basekit/migrate@v3.2.1-0.20180724125854-2fc69c806a45+incompatible/util.go (about)

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