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  }