github.com/cnotch/ipchub@v1.1.0/utils/scan/pair.go (about) 1 // Copyright (c) 2019,CAOHONGJU All rights reserved. 2 // Use of this source code is governed by a MIT-style 3 // license that can be found in the LICENSE file. 4 5 package scan 6 7 import ( 8 "strings" 9 "unicode" 10 "unicode/utf8" 11 ) 12 13 // 预定义Pair扫描对象 14 var ( 15 // EqualPair 扫描 K=V这类形式的Pair字串 16 EqualPair = NewPair('=', 17 func(r rune) bool { 18 return unicode.IsSpace(r) || r == '"' 19 }) 20 21 // ColonPair 扫描 K:V 这类形式的Pair字串 22 ColonPair = NewPair(':', 23 func(r rune) bool { 24 return unicode.IsSpace(r) || r == '"' 25 }) 26 ) 27 28 // Pair 从字串扫描Key Value 值 29 type Pair struct { 30 delim rune // Key Value 间的分割 31 delimLen int // 分割符长度 32 trimFunc func(r rune) bool // 返回前 Trim使用的函数 33 } 34 35 // NewPair 新建 Pair 扫描器 36 func NewPair(delim rune, trimFunc func(r rune) bool) Pair { 37 pair := Pair{ 38 delim: delim, 39 trimFunc: trimFunc, 40 } 41 pair.delimLen = utf8.RuneLen(delim) 42 if trimFunc == nil { 43 pair.trimFunc = func(r rune) bool { return false } 44 } 45 return pair 46 } 47 48 // Scan 提取 K V 49 func (p Pair) Scan(s string) (key, value string, found bool) { 50 if p.delim == 0 { 51 return s, "", false 52 } 53 54 i := strings.IndexRune(s, p.delim) 55 if i < 0 { 56 return s, "", false 57 } 58 59 return strings.TrimFunc(s[:i], p.trimFunc), 60 strings.TrimFunc(s[i+p.delimLen:], p.trimFunc), true 61 }