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  }