github.com/sealerio/sealer@v0.11.1-0.20240507115618-f4f89c5853ae/utils/strings/strings.go (about) 1 // Copyright © 2022 Alibaba Group Holding Ltd. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package strings 16 17 import ( 18 "net" 19 "strings" 20 "unicode" 21 ) 22 23 type Interface interface { 24 // GetIntersection get intersection element form between slice. 25 GetIntersection() []string 26 // GetUnion get Union element between two slice. 27 GetUnion() []string 28 // GetSrcSubtraction get different element in src compare to dst. 29 GetSrcSubtraction() []string 30 // GetDstSubtraction get different element in dst compare to src. 31 GetDstSubtraction() []string 32 } 33 34 type Comparator struct { 35 Src []string 36 Dst []string 37 } 38 39 func (c Comparator) GetIntersection() []string { 40 var result []string 41 for _, elem := range c.Src { 42 // elem both exist in src and dst at the same time. 43 if IsInSlice(elem, c.Dst) { 44 result = append(result, elem) 45 } 46 } 47 return result 48 } 49 50 func (c Comparator) GetUnion() []string { 51 result := c.Src 52 for _, elem := range c.Dst { 53 // get all elem 54 if !IsInSlice(elem, c.Src) { 55 result = append(result, elem) 56 } 57 } 58 return result 59 } 60 61 func (c Comparator) GetSrcSubtraction() []string { 62 var result []string 63 for _, elem := range c.Src { 64 // get src elem which not in dst 65 if !IsInSlice(elem, c.Dst) { 66 result = append(result, elem) 67 } 68 } 69 return result 70 } 71 72 func (c Comparator) GetDstSubtraction() []string { 73 var result []string 74 for _, elem := range c.Dst { 75 // get dst elem which not in src 76 if !IsInSlice(elem, c.Src) { 77 result = append(result, elem) 78 } 79 } 80 return result 81 } 82 83 func NewComparator(src, dst []string) Interface { 84 return Comparator{ 85 Src: src, 86 Dst: dst, 87 } 88 } 89 90 func IsInSlice(key string, slice []string) bool { 91 for _, s := range slice { 92 if key == s { 93 return true 94 } 95 } 96 return false 97 } 98 99 func Reverse(s []string) []string { 100 for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { 101 s[i], s[j] = s[j], s[i] 102 } 103 return s 104 } 105 106 func ContainPartial(list []string, partial string) (result []string) { 107 for i := range list { 108 if strings.Contains(list[i], partial) { 109 result = append(result, list[i]) 110 } 111 } 112 return 113 } 114 115 func RemoveDuplicate(list []string) []string { 116 var result []string 117 flagMap := map[string]struct{}{} 118 for _, v := range list { 119 if _, ok := flagMap[v]; !ok { 120 flagMap[v] = struct{}{} 121 result = append(result, v) 122 } 123 } 124 return result 125 } 126 127 func IsLetterOrNumber(k string) bool { 128 for _, r := range k { 129 if r == '_' { 130 continue 131 } 132 if !unicode.IsLetter(r) && !unicode.IsNumber(r) { 133 return false 134 } 135 } 136 return true 137 } 138 139 // Merge :merge slice type as overwrite model 140 func Merge(ms ...[]string) []string { 141 var base []string 142 diffMap := make(map[string]bool) 143 for i, s := range ms { 144 if i == 0 { 145 base = s 146 for _, v := range base { 147 diffMap[v] = true 148 } 149 } 150 151 for _, v := range s { 152 if !diffMap[v] { 153 base = append(base, v) 154 diffMap[v] = true 155 } 156 } 157 } 158 return base 159 } 160 161 // ConvertStringSliceToMap Convert []string to map[string]string 162 func ConvertStringSliceToMap(stringSlice []string) (stringInterfaceMap map[string]string) { 163 ret := make(map[string]string, len(stringSlice)) 164 for _, env := range stringSlice { 165 parsed := strings.SplitN(env, "=", 2) 166 if len(parsed) != 2 { 167 continue 168 } 169 ret[parsed[0]] = parsed[1] 170 } 171 172 return ret 173 } 174 175 func Diff(old, new []net.IP) (add, sub []net.IP) { 176 diffMap := make(map[string]bool) 177 for _, v := range old { 178 diffMap[v.String()] = true 179 } 180 for _, v := range new { 181 if !diffMap[v.String()] { 182 add = append(add, v) 183 } else { 184 diffMap[v.String()] = false 185 } 186 } 187 for _, v := range old { 188 if diffMap[v.String()] { 189 sub = append(sub, v) 190 } 191 } 192 193 return 194 }