61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
package domain
|
|
|
|
import (
|
|
"github.com/google/uuid"
|
|
"go.mongodb.org/mongo-driver/v2/bson"
|
|
)
|
|
|
|
type UUID struct {
|
|
uuid.NullUUID
|
|
}
|
|
|
|
func (u UUID) IsZero() bool {
|
|
return !u.Valid
|
|
}
|
|
|
|
func (u UUID) MarshalBSONValue() (byte, []byte, error) {
|
|
if !u.Valid {
|
|
return byte(bson.TypeString), nil, nil
|
|
}
|
|
|
|
metaLen := 4
|
|
uuidWithEndLen := 37
|
|
b := make([]byte, 0, metaLen+uuidWithEndLen)
|
|
b = append(b, byte(uuidWithEndLen), 0, 0, 0)
|
|
b = append(b, u.UUID.String()...)
|
|
b = append(b, 0)
|
|
|
|
return byte(bson.TypeString), b, nil
|
|
}
|
|
|
|
func (u *UUID) UnmarshalBSONValue(_ byte, data []byte) error {
|
|
if len(data) == 0 {
|
|
u.Valid = false
|
|
return nil
|
|
}
|
|
|
|
parsed, err := uuid.ParseBytes(data[4:40]) // Удаляем метаданные строки - 4 байта длины в начале и байт конца строки в конце
|
|
if err != nil {
|
|
u.Valid = false
|
|
return err
|
|
}
|
|
|
|
u.UUID = parsed
|
|
u.Valid = true
|
|
|
|
return nil
|
|
}
|
|
|
|
func (u UUID) String() string {
|
|
if !u.Valid {
|
|
return "<nil>"
|
|
}
|
|
return u.UUID.String()
|
|
}
|
|
|
|
func GenerateUUID() UUID {
|
|
return UUID{NullUUID: uuid.NullUUID{
|
|
UUID: uuid.New(),
|
|
Valid: true,
|
|
}}
|
|
}
|