github.com/pion/webrtc/v4@v4.0.1/internal/util/util.go (about) 1 // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly> 2 // SPDX-License-Identifier: MIT 3 4 // Package util provides auxiliary functions internally used in webrtc package 5 package util 6 7 import ( 8 "errors" 9 "strings" 10 11 "github.com/pion/randutil" 12 ) 13 14 const ( 15 runesAlpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 16 ) 17 18 // Use global random generator to properly seed by crypto grade random. 19 var globalMathRandomGenerator = randutil.NewMathRandomGenerator() // nolint:gochecknoglobals 20 21 // MathRandAlpha generates a mathematical random alphabet sequence of the requested length. 22 func MathRandAlpha(n int) string { 23 return globalMathRandomGenerator.GenerateString(n, runesAlpha) 24 } 25 26 // RandUint32 generates a mathematical random uint32. 27 func RandUint32() uint32 { 28 return globalMathRandomGenerator.Uint32() 29 } 30 31 // FlattenErrs flattens multiple errors into one 32 func FlattenErrs(errs []error) error { 33 errs2 := []error{} 34 for _, e := range errs { 35 if e != nil { 36 errs2 = append(errs2, e) 37 } 38 } 39 if len(errs2) == 0 { 40 return nil 41 } 42 return multiError(errs2) 43 } 44 45 type multiError []error //nolint:errname 46 47 func (me multiError) Error() string { 48 var errstrings []string 49 50 for _, err := range me { 51 if err != nil { 52 errstrings = append(errstrings, err.Error()) 53 } 54 } 55 56 if len(errstrings) == 0 { 57 return "multiError must contain multiple error but is empty" 58 } 59 60 return strings.Join(errstrings, "\n") 61 } 62 63 func (me multiError) Is(err error) bool { 64 for _, e := range me { 65 if errors.Is(e, err) { 66 return true 67 } 68 if me2, ok := e.(multiError); ok { //nolint:errorlint 69 if me2.Is(err) { 70 return true 71 } 72 } 73 } 74 return false 75 }