validate.go

 1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2//
 3// SPDX-License-Identifier: AGPL-3.0-or-later
 4
 5// Package validate provides input validation helpers.
 6package validate
 7
 8import (
 9	"errors"
10	"fmt"
11
12	"github.com/google/uuid"
13
14	"git.secluded.site/lune/internal/deeplink"
15)
16
17// ErrInvalidID indicates an ID is not a valid UUID.
18var ErrInvalidID = errors.New("invalid ID: expected UUID format")
19
20// ErrInvalidReference indicates the input is not a valid UUID or deep link.
21var ErrInvalidReference = errors.New("invalid reference: expected UUID or lunatask:// deep link")
22
23// ID validates that the given string is a valid Lunatask ID (UUID).
24func ID(id string) error {
25	if _, err := uuid.Parse(id); err != nil {
26		return fmt.Errorf("%w: %s", ErrInvalidID, id)
27	}
28
29	return nil
30}
31
32// Reference parses a UUID or Lunatask deep link and returns the normalised UUID.
33// Accepts formats:
34//   - UUID: "3bbf1923-64ae-4bcf-96a9-9bb86c799dab"
35//   - Deep link: "lunatask://areas/3bbf1923-64ae-4bcf-96a9-9bb86c799dab"
36func Reference(input string) (string, error) {
37	id, err := deeplink.ParseID(input)
38	if err != nil {
39		return "", fmt.Errorf("%w: %s", ErrInvalidReference, input)
40	}
41
42	return id, nil
43}