github.com/Systemnick/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 }