signoz/pkg/valuer/uuid.go

135 lines
2.2 KiB
Go

package valuer
import (
"database/sql/driver"
"encoding/json"
"fmt"
"reflect"
"github.com/google/uuid"
)
var _ Valuer = (*UUID)(nil)
type UUID struct {
val uuid.UUID
}
func NewUUID(value string) (UUID, error) {
val, err := uuid.Parse(value)
if err != nil {
return UUID{}, err
}
return UUID{
val: val,
}, nil
}
func NewUUIDFromBytes(value []byte) (UUID, error) {
val, err := uuid.ParseBytes(value)
if err != nil {
return UUID{}, err
}
return UUID{
val: val,
}, nil
}
func MustNewUUID(val string) UUID {
uuid, err := NewUUID(val)
if err != nil {
panic(err)
}
return uuid
}
func GenerateUUID() UUID {
val, err := uuid.NewV7()
if err != nil {
panic(err)
}
return UUID{
val: val,
}
}
func (enum UUID) IsZero() bool {
return enum.val == uuid.UUID{}
}
func (enum UUID) StringValue() string {
return enum.val.String()
}
func (enum UUID) String() string {
return enum.val.String()
}
func (enum UUID) MarshalJSON() ([]byte, error) {
return json.Marshal(enum.StringValue())
}
func (enum *UUID) UnmarshalJSON(data []byte) error {
var str string
if err := json.Unmarshal(data, &str); err != nil {
return err
}
uuid, err := NewUUID(str)
if err != nil {
return err
}
*enum = uuid
return nil
}
func (enum UUID) Value() (driver.Value, error) {
return enum.StringValue(), nil
}
func (enum *UUID) Scan(val interface{}) error {
if enum == nil {
return fmt.Errorf("uuid: (nil \"%s\")", reflect.TypeOf(enum).String())
}
if val == nil {
return fmt.Errorf("uuid: (nil \"%s\")", reflect.TypeOf(val).String())
}
var enumVal UUID
switch val := val.(type) {
case string:
_enumVal, err := NewUUID(val)
if err != nil {
return fmt.Errorf("uuid: (invalid-uuid \"%s\")", err.Error())
}
enumVal = _enumVal
case []byte:
_enumVal, err := NewUUIDFromBytes(val)
if err != nil {
return fmt.Errorf("uuid: (invalid-uuid \"%s\")", err.Error())
}
enumVal = _enumVal
default:
return fmt.Errorf("uuid: (non-uuid \"%s\")", reflect.TypeOf(val).String())
}
*enum = enumVal
return nil
}
func (enum *UUID) UnmarshalText(text []byte) error {
uuid, err := NewUUID(string(text))
if err != nil {
return err
}
*enum = uuid
return nil
}