70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package domain
|
|
|
|
import (
|
|
"github.com/google/uuid"
|
|
"go.mongodb.org/mongo-driver/v2/bson"
|
|
)
|
|
|
|
type UUID 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(
|
|
uuid.NullUUID{
|
|
UUID: uuid.New(),
|
|
Valid: true,
|
|
},
|
|
)
|
|
}
|
|
|
|
func GenerateTestUUID() UUID {
|
|
return UUID(
|
|
uuid.NullUUID{
|
|
UUID: uuid.MustParse("5c94e2c5-7615-4fdc-a2e2-00f71ae1e380"),
|
|
Valid: true,
|
|
},
|
|
)
|
|
}
|