internal/repository/pgtypes.go
Rama main · réplica de lectura del repositorio original.
package repository
import (
"fmt"
"time"
"github.com/google/uuid"
"github.com/jackc/pgx/v5/pgtype"
)
// ParsePgUUID parses id, refusing a malformed one rather than handing the
// database a NULL.
func ParsePgUUID(id string) (pgtype.UUID, error) {
parsed, err := uuid.Parse(id)
if err != nil {
return pgtype.UUID{}, fmt.Errorf("invalid uuid %q: %w", id, err)
}
return pgtype.UUID{Bytes: parsed, Valid: true}, nil
}
// ParsePgUUIDs parses every id; nil for an empty input.
func ParsePgUUIDs(ids []string) ([]pgtype.UUID, error) {
if len(ids) == 0 {
return nil, nil
}
parsed := make([]pgtype.UUID, 0, len(ids))
for _, id := range ids {
pgID, err := ParsePgUUID(id)
if err != nil {
return nil, err
}
parsed = append(parsed, pgID)
}
return parsed, nil
}
// ToPgUUID maps a malformed id to the SQL NULL uuid; callers whose input is
// not validated upstream should use ParsePgUUID.
func ToPgUUID(id string) pgtype.UUID {
pgID, err := ParsePgUUID(id)
if err != nil {
return pgtype.UUID{}
}
return pgID
}
// ToPgUUIDPtr maps a nil pointer to the SQL NULL uuid.
func ToPgUUIDPtr(id *string) pgtype.UUID {
if id == nil {
return pgtype.UUID{}
}
return ToPgUUID(*id)
}
// ToPgTimestamptz maps a nil pointer to the SQL NULL timestamptz.
func ToPgTimestamptz(t *time.Time) pgtype.Timestamptz {
if t == nil {
return pgtype.Timestamptz{}
}
return pgtype.Timestamptz{Time: *t, Valid: true}
}
// FromPgTimestamptz maps the SQL NULL timestamptz to a nil pointer.
func FromPgTimestamptz(ts pgtype.Timestamptz) *time.Time {
if !ts.Valid {
return nil
}
t := ts.Time
return &t
}