mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-07-27 19:32:00 +08:00
135 lines
2.2 KiB
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
|
|
}
|