github.com/whatap/golib@v0.0.22/util/paramtext/ParamKV.go (about)

     1  package paramtext
     2  
     3  import (
     4  	"bytes"
     5  	//"fmt"
     6  	"strings"
     7  )
     8  
     9  /**
    10  문자열 내부 key=value 조합의 value 값을 치환
    11  
    12  separate : key=value(구분자:seperate)key=value
    13  kvPipe : key(pipe)value
    14  ToStringMap : k,v Map을 받아서 해당 key의 value를 모두 변경
    15  ToStringStr : k,v string으로 하나의 키만 변환.
    16  */
    17  
    18  type ParamKV struct {
    19  	separate  string
    20  	kvPipe    string
    21  	tokenList []string
    22  	kvMap     map[string]string
    23  	origin    string
    24  }
    25  
    26  func NewParamKV(plainText string) *ParamKV {
    27  	return NewParamKVSeperate(plainText, " ", "=")
    28  }
    29  
    30  func NewParamKVSeperate(plainText string, separate string, kvPipe string) *ParamKV {
    31  	p := new(ParamKV)
    32  	p.separate = separate
    33  	p.kvPipe = kvPipe
    34  	p.tokenList = strings.Split(plainText, separate)
    35  	p.kvMap = make(map[string]string)
    36  	p.origin = plainText
    37  
    38  	if p.tokenList != nil {
    39  		for _, kv := range p.tokenList {
    40  			k, v := ToPair(kv, p.kvPipe)
    41  			if k != "" {
    42  				p.kvMap[k] = v
    43  			}
    44  		}
    45  	}
    46  	return p
    47  }
    48  
    49  func (this *ParamKV) ToStringMap(p map[string]string) string {
    50  	// key 의 value 치환
    51  	for key, val := range p {
    52  		if this.ExistsKey(key) {
    53  			this.kvMap[key] = val
    54  		}
    55  	}
    56  
    57  	return this.ToString()
    58  }
    59  
    60  func (this *ParamKV) ToStringStr(k, v string) string {
    61  
    62  	if this.ExistsKey(k) {
    63  		this.kvMap[k] = v
    64  	}
    65  
    66  	return this.ToString()
    67  }
    68  
    69  func (this *ParamKV) ToString() string {
    70  	var buffer bytes.Buffer
    71  
    72  	if this.tokenList != nil {
    73  		kvLen := len(this.tokenList)
    74  		for i, kv := range this.tokenList {
    75  			k, _ := ToPair(kv, this.kvPipe)
    76  			if k != "" {
    77  				buffer.WriteString(k)
    78  				buffer.WriteString(this.kvPipe)
    79  				buffer.WriteString(this.kvMap[k])
    80  
    81  			} else {
    82  				buffer.WriteString(kv)
    83  			}
    84  
    85  			if i < kvLen-1 {
    86  				buffer.WriteString(this.separate)
    87  			}
    88  		}
    89  	}
    90  
    91  	return buffer.String()
    92  }
    93  
    94  func (this *ParamKV) ExistsKey(key string) bool {
    95  	_, exists := this.kvMap[key]
    96  	return exists
    97  }
    98  
    99  func (this *ParamKV) GetKeys() []string {
   100  	keys := make([]string, len(this.kvMap))
   101  	i := 0
   102  	for k := range this.kvMap {
   103  		keys[i] = k
   104  		i++
   105  	}
   106  	return keys
   107  }
   108  
   109  func (this *ParamKV) GetValue(key string) string {
   110  	if this.ExistsKey(key) {
   111  		return this.kvMap[key]
   112  	}
   113  	return ""
   114  }
   115  
   116  func (this *ParamKV) GetOriginal() string {
   117  	return this.origin
   118  }
   119  
   120  // get k, v
   121  func ToPair(s string, sep string) (k, v string) {
   122  	pos := 0
   123  	pos = strings.Index(strings.ToLower(s), strings.ToLower(sep))
   124  	if pos != -1 {
   125  		k = s[0:pos]
   126  		v = s[pos+len(sep):]
   127  	} else {
   128  		k = ""
   129  		v = ""
   130  	}
   131  
   132  	return strings.TrimSpace(k), strings.TrimSpace(v)
   133  }