chat_back_go/internal/domain/uuid.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,
},
)
}