I get the error WriteValueBytes can only write while positioned on a Element or Value but is positioned on a TopLevel
when trying to create a custom mashler/unmashler for bson.M
I have a custom type called TransactionId which represents a UUID I want to convert this value into a string before storing to monbodb and Also convert it back from a string when pulling the value from mongodb.
This is the code I have so far
package main
import (
"github.com/google/uuid"
"github.com/pkg/errors"
"go.mongodb.org/mongo-driver/bson/bsontype"
"go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
"go.mongodb.org/mongo-driver/bson"
"log"
)
// TransactionID is a UUID used to trace a batch of work which is being processed.
type TransactionID uuid.UUID
// String returns the transaction id as a string
func (id TransactionID) String() (result string, err error) {
val, err := uuid.FromBytes(id[:])
if err != nil {
return result, errors.Wrapf(err, "cannot convert transaction ID %s to UUID", string(id[:]))
}
return val.String(), nil
}
func (id TransactionID) MarshalBSONValue() (bsontype.Type, []byte, error) {
idString, err := id.String()
if err != nil {
return bsontype.String, nil, err
}
return bsontype.String, bsoncore.AppendString(nil, idString), nil
}
func (id *TransactionID) UnmarshalBSONValue(bsonType bsontype.Type, bytes []byte) error {
uid, err := uuid.FromBytes(bytes)
if err != nil {
return err
}
*id = TransactionID(uid)
return nil
}
func NewTransactionID() TransactionID {
return TransactionID(uuid.New())
}
func main() {
id := NewTransactionID()
_, err := bson.Marshal(id)
if err != nil {
log.Fatal(err)
}
}
I'm getting the WriteValueBytes can only write while positioned on a Element or Value but is positioned on a TopLevel
in the unmarshal step.