github.com/requaos/migrate@v3.4.0+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 }