2025-03-25 04:05:40 +05:30
|
|
|
package valuer
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"database/sql/driver"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"reflect"
|
|
|
|
|
|
2025-09-09 15:44:27 +05:30
|
|
|
"github.com/SigNoz/signoz/pkg/errors"
|
2025-03-25 04:05:40 +05:30
|
|
|
"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) {
|
2025-06-26 16:34:49 +05:30
|
|
|
val, err := uuid.FromBytes(value)
|
2025-03-25 04:05:40 +05:30
|
|
|
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()
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-07 20:36:04 +05:30
|
|
|
func (enum UUID) String() string {
|
|
|
|
|
return enum.val.String()
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-26 16:34:49 +05:30
|
|
|
func (enum UUID) MarshalBinary() ([]byte, error) {
|
|
|
|
|
return enum.val.MarshalBinary()
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-25 04:05:40 +05:30
|
|
|
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 {
|
2025-09-09 15:44:27 +05:30
|
|
|
return errors.Newf(errors.TypeInternal, ErrCodeUnknownValuerScan, "uuid: (nil \"%s\")", reflect.TypeOf(enum).String())
|
2025-03-25 04:05:40 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if val == nil {
|
2025-09-09 15:44:27 +05:30
|
|
|
return errors.Newf(errors.TypeInternal, ErrCodeUnknownValuerScan, "uuid: (nil \"%s\")", reflect.TypeOf(val).String())
|
2025-03-25 04:05:40 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var enumVal UUID
|
|
|
|
|
switch val := val.(type) {
|
|
|
|
|
case string:
|
|
|
|
|
_enumVal, err := NewUUID(val)
|
|
|
|
|
if err != nil {
|
2025-09-09 15:44:27 +05:30
|
|
|
return errors.Newf(errors.TypeInternal, ErrCodeUnknownValuerScan, "uuid: (invalid-uuid \"%s\")", err.Error())
|
2025-03-25 04:05:40 +05:30
|
|
|
}
|
|
|
|
|
enumVal = _enumVal
|
|
|
|
|
case []byte:
|
|
|
|
|
_enumVal, err := NewUUIDFromBytes(val)
|
|
|
|
|
if err != nil {
|
2025-09-09 15:44:27 +05:30
|
|
|
return errors.Newf(errors.TypeInternal, ErrCodeUnknownValuerScan, "uuid: (invalid-uuid \"%s\")", err.Error())
|
2025-03-25 04:05:40 +05:30
|
|
|
}
|
|
|
|
|
enumVal = _enumVal
|
|
|
|
|
default:
|
2025-09-09 15:44:27 +05:30
|
|
|
return errors.Newf(errors.TypeInternal, ErrCodeUnknownValuerScan, "uuid: (non-uuid \"%s\")", reflect.TypeOf(val).String())
|
2025-03-25 04:05:40 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*enum = enumVal
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2025-05-31 16:04:13 +05:30
|
|
|
|
|
|
|
|
func (enum *UUID) UnmarshalText(text []byte) error {
|
|
|
|
|
uuid, err := NewUUID(string(text))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*enum = uuid
|
|
|
|
|
return nil
|
|
|
|
|
}
|