1
0
mirror of https://github.com/StackExchange/dnscontrol.git synced 2024-05-11 05:55:12 +00:00
Files
stackexchange-dnscontrol/vendor/github.com/hexonet/go-sdk/responseparser/responseparser.go
Joel Margolis 1232c17293 HEXONET: Update hexonet-sdk to v2.2.3+incompatible (#662)
* Update hexonet-sdk to v2.2.3+incompatible

* Update vendor

* Go mod tidy
2020-02-27 13:04:17 -05:00

99 lines
2.6 KiB
Go

// Copyright (c) 2018 Kai Schwarz (HEXONET GmbH). All rights reserved.
//
// Use of this source code is governed by the MIT
// license that can be found in the LICENSE.md file.
// Package responseparser provides functionality to cover API response
// data parsing and serializing.
package responseparser
import (
"fmt"
"regexp"
"sort"
"strings"
)
// Parse method to return plain API response parsed into hash format
func Parse(r string) map[string]interface{} {
hash := make(map[string]interface{})
tmp := strings.Split(strings.Replace(r, "\r", "", -1), "\n")
p1 := regexp.MustCompile("^([^\\=]*[^\\t\\= ])[\\t ]*=[\\t ]*(.*)$")
p2 := regexp.MustCompile("(?i)^property\\[([^\\]]*)\\]\\[([0-9]+)\\]")
properties := make(map[string][]string)
for _, row := range tmp {
m := p1.MatchString(row)
if m {
groups := p1.FindStringSubmatch(row)
property := strings.ToUpper(groups[1])
mm := p2.MatchString(property)
if mm {
groups2 := p2.FindStringSubmatch(property)
key := strings.Replace(strings.ToUpper(groups2[1]), "\\s", "", -1)
// idx2 := strconv.Atoi(groups2[2])
list := make([]string, len(properties[key]))
copy(list, properties[key])
pat := regexp.MustCompile("[\\t ]*$")
rep1 := "${1}$2"
list = append(list, pat.ReplaceAllString(groups[2], rep1))
properties[key] = list
} else {
val := groups[2]
if len(val) > 0 {
pat := regexp.MustCompile("[\\t ]*$")
hash[property] = pat.ReplaceAllString(val, "")
}
}
}
}
if len(properties) > 0 {
hash["PROPERTY"] = properties
}
if _, ok := hash["DESCRIPTION"]; !ok {
hash["DESCRIPTION"] = ""
}
return hash
}
// Serialize method to serialize API response hash format back to string
func Serialize(hash map[string]interface{}) string {
var plain strings.Builder
plain.WriteString("[RESPONSE]")
keys := []string{}
for k := range hash {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
if strings.Compare(k, "PROPERTY") == 0 {
p := hash[k].(map[string][]string)
keys2 := []string{}
for k2 := range p {
keys2 = append(keys2, k2)
}
sort.Strings(keys2)
for _, k2 := range keys2 {
v2 := p[k2]
for i, v3 := range v2 {
plain.WriteString("\r\nPROPERTY[")
plain.WriteString(k2)
plain.WriteString("][")
plain.WriteString(fmt.Sprintf("%d", i))
plain.WriteString("]=")
plain.WriteString(v3)
}
}
} else {
tmp := hash[k].(string)
if len(tmp) > 0 {
plain.WriteString("\r\n")
plain.WriteString(k)
plain.WriteString("=")
plain.WriteString(tmp)
}
}
}
plain.WriteString("\r\nEOF\r\n")
return plain.String()
}