dnscontrol/vendor/github.com/hexonet/go-sdk/responsetemplatemanager/responsetemplatemanager.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

108 lines
3.8 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 responsetemplatemanager provides basic functionality to handle API response data
package responsetemplatemanager
import (
"strings"
"sync"
rp "github.com/hexonet/go-sdk/responseparser"
rt "github.com/hexonet/go-sdk/responsetemplate"
)
// ResponseTemplateManager is a struct used to cover basic functionality to work with
// API response templates.
type ResponseTemplateManager struct {
templates map[string]string
}
var instance *ResponseTemplateManager
var once sync.Once
// GetInstance method to return the responsetemplatemanager singleton instance
func GetInstance() *ResponseTemplateManager {
once.Do(func() {
instance = &ResponseTemplateManager{
templates: map[string]string{
"404": generateTemplate("421", "Page not found"),
"500": generateTemplate("500", "Internal server error"),
"empty": generateTemplate("423", "Empty API response. Probably unreachable API end point"),
"error": generateTemplate("421", "Command failed due to server error. Client should try again"),
"expired": generateTemplate("530", "SESSION NOT FOUND"),
"httperror": generateTemplate("421", "Command failed due to HTTP communication error"),
"unauthorized": generateTemplate("530", "Unauthorized"),
},
}
})
return instance
}
// generateTemplate method to generate API a response template string
// for given code and description
func generateTemplate(code string, description string) string {
var tmp strings.Builder
tmp.WriteString("[RESPONSE]\r\nCODE=")
tmp.WriteString(code)
tmp.WriteString("\r\nDESCRIPTION=")
tmp.WriteString(description)
tmp.WriteString("\r\nEOF\r\n")
return tmp.String()
}
// GenerateTemplate method to generate API a response template string
// for given code and description
func (rtm *ResponseTemplateManager) GenerateTemplate(code string, description string) string {
return generateTemplate(code, description)
}
// AddTemplate method to add a template to the templates container
func (rtm *ResponseTemplateManager) AddTemplate(id string, plain string) *ResponseTemplateManager {
rtm.templates[id] = plain
return rtm
}
// GetTemplate method to get a ResponseTemplate from templates container
func (rtm *ResponseTemplateManager) GetTemplate(id string) *rt.ResponseTemplate {
if rtm.HasTemplate(id) {
return rt.NewResponseTemplate(rtm.templates[id])
}
return rt.NewResponseTemplate(generateTemplate("500", "Response Template not found"))
}
// GetTemplates method to return a map covering all available response templates
func (rtm *ResponseTemplateManager) GetTemplates() map[string]rt.ResponseTemplate {
tpls := map[string]rt.ResponseTemplate{}
for key := range rtm.templates {
tpls[key] = *rt.NewResponseTemplate(rtm.templates[key])
}
return tpls
}
// HasTemplate method to check if given template id exists in template container
func (rtm *ResponseTemplateManager) HasTemplate(id string) bool {
if _, ok := rtm.templates[id]; ok {
return true
}
return false
}
// IsTemplateMatchHash method to check if given API response hash matches a given
// template by code and description
func (rtm *ResponseTemplateManager) IsTemplateMatchHash(tpl2 map[string]interface{}, id string) bool {
h := rtm.GetTemplate(id).GetHash()
return ((h["CODE"] == tpl2["CODE"].(string)) &&
(h["DESCRIPTION"] == tpl2["DESCRIPTION"].(string)))
}
// IsTemplateMatchPlain method to check if given API plain response matches a given
// template by code and description
func (rtm *ResponseTemplateManager) IsTemplateMatchPlain(plain string, id string) bool {
h := rtm.GetTemplate(id).GetHash()
tpl2 := rp.Parse(plain)
return ((h["CODE"] == tpl2["CODE"].(string)) &&
(h["DESCRIPTION"] == tpl2["DESCRIPTION"].(string)))
}