go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/stringutil/runesets.go (about) 1 /* 2 3 Copyright (c) 2023 - Present. Will Charczuk. All rights reserved. 4 Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository. 5 6 */ 7 8 package stringutil 9 10 import ( 11 "math/rand" 12 "time" 13 ) 14 15 var ( 16 // LowerLetters is a runset of lowercase letters. 17 LowerLetters Runeset = []rune(`abcdefghijklmnopqrstuvwxyz`) 18 19 // UpperLetters is a runset of uppercase letters. 20 UpperLetters Runeset = []rune(`ABCDEFGHIJKLMNOPQRSTUVWXYZ`) 21 22 // Letters is a runset of both lower and uppercase letters. 23 Letters = append(LowerLetters, UpperLetters...) 24 25 // Numbers is a runset of numeric characters. 26 Numbers Runeset = []rune(`0123456789`) 27 28 // LettersAndNumbers is a runset of letters and numeric characters. 29 LettersAndNumbers = append(Letters, Numbers...) 30 31 // Symbols is a runset of symbol characters. 32 Symbols Runeset = []rune(`!@#$%^&*()_+-=[]{}\|:;`) 33 34 // LettersNumbersAndSymbols is a runset of letters, numbers and symbols. 35 LettersNumbersAndSymbols = append(LettersAndNumbers, Symbols...) 36 ) 37 38 // Runeset is a set of runes 39 type Runeset []rune 40 41 // Len implements part of sorter. 42 func (rs Runeset) Len() int { 43 return len(rs) 44 } 45 46 // Swap implements part of sorter. 47 func (rs Runeset) Swap(i, j int) { 48 rs[i], rs[j] = rs[j], rs[i] 49 } 50 51 // Less implements part of sorter. 52 func (rs Runeset) Less(i, j int) bool { 53 return uint16(rs[i]) < uint16(rs[j]) 54 } 55 56 var ( 57 _provider = rand.New(rand.NewSource(time.Now().UnixNano())) 58 ) 59 60 // Random returns a random selection of runes from the set. 61 func (rs Runeset) Random(length int) string { 62 runes := make([]rune, length) 63 for index := range runes { 64 runes[index] = rs[_provider.Intn(len(rs)-1)] 65 } 66 return string(runes) 67 } 68 69 // RandomProvider returns a random selection of runes from the set. 70 func (rs Runeset) RandomProvider(provider *rand.Rand, length int) string { 71 runes := make([]rune, length) 72 for index := range runes { 73 runes[index] = rs[provider.Intn(len(rs)-1)] 74 } 75 return string(runes) 76 }