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}