add.go

 1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2//
 3// SPDX-License-Identifier: AGPL-3.0-or-later
 4
 5package person
 6
 7import (
 8	"fmt"
 9
10	"git.secluded.site/go-lunatask"
11	"git.secluded.site/lune/internal/client"
12	"git.secluded.site/lune/internal/completion"
13	"git.secluded.site/lune/internal/ui"
14	"git.secluded.site/lune/internal/validate"
15	"github.com/spf13/cobra"
16)
17
18// AddCmd creates a new person. Exported for potential use by shortcuts.
19var AddCmd = &cobra.Command{
20	Use:   "add FIRST LAST",
21	Short: "Add a new person",
22	Long: `Add a new person to the Lunatask relationship tracker.
23
24Names are required. Use flags to set additional properties.`,
25	Args: cobra.ExactArgs(2),
26	RunE: runAdd,
27}
28
29func init() {
30	AddCmd.Flags().StringP("relationship", "r", "", "Relationship strength")
31	AddCmd.Flags().String("source", "", "Source identifier")
32	AddCmd.Flags().String("source-id", "", "Source ID")
33
34	_ = AddCmd.RegisterFlagCompletionFunc("relationship", completion.Relationships)
35}
36
37func runAdd(cmd *cobra.Command, args []string) error {
38	firstName := args[0]
39	lastName := args[1]
40
41	apiClient, err := client.New()
42	if err != nil {
43		return err
44	}
45
46	builder := apiClient.NewPerson(firstName, lastName)
47
48	if err := applyRelationship(cmd, builder); err != nil {
49		return err
50	}
51
52	applySource(cmd, builder)
53
54	person, err := ui.Spin("Creating person…", func() (*lunatask.Person, error) {
55		return builder.Create(cmd.Context())
56	})
57	if err != nil {
58		return err
59	}
60
61	fmt.Fprintln(cmd.OutOrStdout(), ui.Success.Render("Created person: "+person.ID))
62
63	return nil
64}
65
66func applyRelationship(cmd *cobra.Command, builder *lunatask.PersonBuilder) error {
67	rel, _ := cmd.Flags().GetString("relationship")
68	if rel == "" {
69		return nil
70	}
71
72	strength, err := validate.RelationshipStrength(rel)
73	if err != nil {
74		return err
75	}
76
77	builder.WithRelationshipStrength(strength)
78
79	return nil
80}
81
82func applySource(cmd *cobra.Command, builder *lunatask.PersonBuilder) {
83	source, _ := cmd.Flags().GetString("source")
84	sourceID, _ := cmd.Flags().GetString("source-id")
85
86	if source != "" && sourceID != "" {
87		builder.FromSource(source, sourceID)
88	}
89}