util: Add value to B64 serialization functions

These small utility functions are useful.
This commit is contained in:
James Shubin
2023-12-03 15:25:40 -05:00
parent 55932cf3c7
commit 019b88cedf

View File

@@ -19,7 +19,10 @@
package util
import (
"bytes"
"context"
"encoding/base64"
"encoding/gob"
"fmt"
"path"
"sort"
@@ -27,6 +30,7 @@ import (
"time"
"github.com/godbus/dbus/v5"
"github.com/purpleidea/mgmt/util/errwrap"
)
// NumToAlpha returns a lower case string of letters representing a number. If
@@ -682,3 +686,33 @@ func SortMapStringValuesByUInt64Keys(m map[uint64]string) []string {
return result
}
// ValueToB64 encodes a value to a base64 encoded string (after serialization).
func ValueToB64(value interface{}) (string, error) {
b := bytes.Buffer{}
e := gob.NewEncoder(&b)
if err := e.Encode(&value); err != nil { // pass with &
return "", errwrap.Wrapf(err, "gob failed to encode")
}
return base64.StdEncoding.EncodeToString(b.Bytes()), nil
}
// B64ToValue decodes a value from a base64 encoded string (after
// deserialization).
func B64ToValue(str string) (interface{}, error) {
var output interface{}
bb, err := base64.StdEncoding.DecodeString(str)
if err != nil {
return nil, errwrap.Wrapf(err, "base64 failed to decode")
}
b := bytes.NewBuffer(bb)
d := gob.NewDecoder(b)
if err := d.Decode(&output); err != nil { // pass with &
return nil, errwrap.Wrapf(err, "gob failed to decode")
}
value, ok := output.(interface{})
if !ok {
return nil, fmt.Errorf("output `%v` is not a value", output)
}
return value, nil
}