1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package lunatask
6
7import (
8 "errors"
9 "fmt"
10 "strings"
11)
12
13// Motivation represents why a task matters.
14type Motivation string
15
16// Valid motivation values.
17const (
18 // MotivationUnknown clears/unsets the motivation (default).
19 MotivationUnknown Motivation = "unknown"
20 MotivationMust Motivation = "must"
21 MotivationShould Motivation = "should"
22 MotivationWant Motivation = "want"
23)
24
25// Errors returned by Motivation operations.
26var (
27 // ErrInvalidMotivation is returned when parsing an unknown motivation string.
28 ErrInvalidMotivation = errors.New("invalid motivation")
29)
30
31// String returns the motivation value as a string.
32func (m Motivation) String() string {
33 return string(m)
34}
35
36// AllMotivations returns all valid motivation values.
37// Includes [MotivationUnknown] which clears/unsets motivation.
38func AllMotivations() []Motivation {
39 return []Motivation{
40 MotivationUnknown,
41 MotivationMust,
42 MotivationShould,
43 MotivationWant,
44 }
45}
46
47// ParseMotivation parses a string to a Motivation value (case-insensitive).
48// Valid values: "unknown", "must", "should", "want".
49func ParseMotivation(str string) (Motivation, error) {
50 switch strings.ToLower(str) {
51 case "unknown":
52 return MotivationUnknown, nil
53 case "must":
54 return MotivationMust, nil
55 case "should":
56 return MotivationShould, nil
57 case "want":
58 return MotivationWant, nil
59 default:
60 return "", fmt.Errorf("%w: %q", ErrInvalidMotivation, str)
61 }
62}