github.com/alimy/mir/v4@v4.1.0/internal/utils/utils.go (about)

     1  // Copyright 2022 Michael Li <alimy@gility.net>. All rights reserved.
     2  // Use of this source code is governed by Apache License 2.0 that
     3  // can be found in the LICENSE file.
     4  
     5  package utils
     6  
     7  import (
     8  	"strings"
     9  	"unicode"
    10  	"unicode/utf8"
    11  )
    12  
    13  // UpperFirst make first rune upper in s string
    14  func UpperFirst(s string) string {
    15  	firstRune, size := utf8.DecodeRuneInString(s)
    16  	if unicode.IsUpper(firstRune) {
    17  		return s
    18  	}
    19  	// encode upperFirst to []byte,use max byte for contain unicode
    20  	res := make([]byte, len(s))
    21  	upperRune := unicode.ToUpper(firstRune)
    22  	number := utf8.EncodeRune(res, upperRune)
    23  	res = res[:number]
    24  	res = append(res, s[size:]...)
    25  	return string(res)
    26  }
    27  
    28  // QuoteJoin give a string slice return a quoted join string by sep
    29  func QuoteJoin(elems []string, sep string) string {
    30  	switch len(elems) {
    31  	case 0:
    32  		return ""
    33  	case 1:
    34  		return elems[0]
    35  	}
    36  	n := len(sep) * (len(elems) - 1)
    37  	for i := 0; i < len(elems); i++ {
    38  		n += len(elems[i]) + 2
    39  	}
    40  
    41  	var b strings.Builder
    42  	b.Grow(n)
    43  	b.WriteByte('"')
    44  	b.WriteString(elems[0])
    45  	b.WriteByte('"')
    46  	for _, s := range elems[1:] {
    47  		b.WriteString(sep)
    48  		b.WriteByte('"')
    49  		b.WriteString(s)
    50  		b.WriteByte('"')
    51  	}
    52  	return b.String()
    53  }