func (e *EvaluationResponse) Render(w http.ResponseWriter, r *http.Request) error {
	return nil
}
Render can enrich the EvaluationResponse object before being returned to the
user. Currently it does nothing, but is needed to satisfy the
chi.Renderer interface.
package service
import (
	"crypto/sha1"  
	"encoding/hex"
	"net/http"
	"sort"
	"github.com/victorkt/clientip"
	"github.com/victorkt/flaggio/internal/flaggio"
	"github.com/vmihailenco/msgpack/v4"
)
type EvaluationRequest struct {
	UserID      string              `json:"userId"`
	UserContext flaggio.UserContext `json:"context"`
	Debug       *bool               `json:"debug,omitempty"`
}
func (er EvaluationRequest) Bind(r *http.Request) error {
	er.UserContext["$userId"] = er.UserID
	er.UserContext["$ip"] = clientip.FromContext(r.Context()).String()
	return nil
}
func (er EvaluationRequest) IsDebug() bool {
	return er.Debug != nil && *er.Debug
}
func (er EvaluationRequest) Hash() (string, error) {
	var contextKeys []string
	for key := range er.UserContext {
		contextKeys = append(contextKeys, key)
	}
	sort.Strings(contextKeys)
	ordered := make([]interface{}, len(contextKeys))
	for idx, key := range contextKeys {
		ordered[idx] = []interface{}{key, er.UserContext[key]}
	}
	bytes, err := msgpack.Marshal(ordered)
	if err != nil {
		return "", err
	}
	h := sha1.New()  
	if _, err := h.Write(bytes); err != nil {
		return "", err
	}
	return hex.EncodeToString(h.Sum(nil)), nil
}
type EvaluationResponse struct {
	Evaluation  *flaggio.Evaluation  `json:"evaluation"`
	UserContext *flaggio.UserContext `json:"context,omitempty"`
}