package core import ( "context" "crypto/rand" "encoding/base64" "log/slog" "github.com/google/uuid" ) type Random interface { Bytes(ctx context.Context, size int) ([]byte, error) String(ctx context.Context, size int) (string, error) UUID(ctx context.Context) (uuid.UUID, error) } type RandomImpl struct { } func NewRandom() *RandomImpl { return &RandomImpl{} } func (r *RandomImpl) Bytes(ctx context.Context, tsize int) ([]byte, error) { b := make([]byte, 32) _, err := rand.Read(b) if err != nil { slog.ErrorContext(ctx, "Error generating random bytes", "err", err) return []byte{}, ErrInternal } return b, nil } func (r *RandomImpl) String(ctx context.Context, size int) (string, error) { bytes, err := r.Bytes(ctx, size) if err != nil { slog.ErrorContext(ctx, "Error generating random string", "err", err) return "", ErrInternal } return base64.StdEncoding.EncodeToString(bytes), nil } func (r *RandomImpl) UUID(ctx context.Context) (uuid.UUID, error) { id, err := uuid.NewRandom() if err != nil { slog.ErrorContext(ctx, "Error generating random UUID", "err", err) return uuid.Nil, ErrInternal } return id, nil }