diff --git a/relationship.go b/relationship.go new file mode 100644 index 0000000000000000000000000000000000000000..6806240a0dc61238f0f1235444e37ea9456c5d81 --- /dev/null +++ b/relationship.go @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: Amolith +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +package lunatask + +import ( + "errors" + "fmt" + "strings" +) + +// Errors returned by RelationshipStrength operations. +var ( + // ErrInvalidRelationshipStrength is returned when parsing an unknown relationship strength string. + ErrInvalidRelationshipStrength = errors.New("invalid relationship strength") +) + +// ParseRelationshipStrength parses a string to a RelationshipStrength value (case-insensitive). +// Valid values: "family", "intimate-friends", "close-friends", "casual-friends", +// "acquaintances", "business-contacts", "almost-strangers". +func ParseRelationshipStrength(str string) (RelationshipStrength, error) { + switch strings.ToLower(str) { + case "family": + return RelationshipFamily, nil + case "intimate-friends": + return RelationshipIntimateFriend, nil + case "close-friends": + return RelationshipCloseFriend, nil + case "casual-friends": + return RelationshipCasualFriend, nil + case "acquaintances": + return RelationshipAcquaintance, nil + case "business-contacts": + return RelationshipBusiness, nil + case "almost-strangers": + return RelationshipAlmostStranger, nil + default: + return "", fmt.Errorf("%w: %q", ErrInvalidRelationshipStrength, str) + } +} diff --git a/relationship_test.go b/relationship_test.go new file mode 100644 index 0000000000000000000000000000000000000000..17d967723d93241aab25d8ea04b76d9fc0669946 --- /dev/null +++ b/relationship_test.go @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: Amolith +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +package lunatask_test + +import ( + "testing" + + lunatask "git.secluded.site/go-lunatask" +) + +func TestParseRelationshipStrength(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + input string + want lunatask.RelationshipStrength + wantErr bool + }{ + {"family_lower", "family", lunatask.RelationshipFamily, false}, + {"family_upper", "FAMILY", lunatask.RelationshipFamily, false}, + {"family_mixed", "FaMiLy", lunatask.RelationshipFamily, false}, + {"intimate_friends_lower", "intimate-friends", lunatask.RelationshipIntimateFriend, false}, + {"intimate_friends_upper", "INTIMATE-FRIENDS", lunatask.RelationshipIntimateFriend, false}, + {"close_friends_lower", "close-friends", lunatask.RelationshipCloseFriend, false}, + {"close_friends_upper", "CLOSE-FRIENDS", lunatask.RelationshipCloseFriend, false}, + {"casual_friends_lower", "casual-friends", lunatask.RelationshipCasualFriend, false}, + {"casual_friends_upper", "CASUAL-FRIENDS", lunatask.RelationshipCasualFriend, false}, + {"acquaintances_lower", "acquaintances", lunatask.RelationshipAcquaintance, false}, + {"acquaintances_upper", "ACQUAINTANCES", lunatask.RelationshipAcquaintance, false}, + {"business_contacts_lower", "business-contacts", lunatask.RelationshipBusiness, false}, + {"business_contacts_upper", "BUSINESS-CONTACTS", lunatask.RelationshipBusiness, false}, + {"almost_strangers_lower", "almost-strangers", lunatask.RelationshipAlmostStranger, false}, + {"almost_strangers_upper", "ALMOST-STRANGERS", lunatask.RelationshipAlmostStranger, false}, + {"almost_strangers_mixed", "Almost-Strangers", lunatask.RelationshipAlmostStranger, false}, + {"invalid", "invalid", "", true}, + {"empty", "", "", true}, + {"numeric", "1", "", true}, + {"typo", "famly", "", true}, + {"no_hyphen", "closefriends", "", true}, + } + + for _, testCase := range tests { + t.Run(testCase.name, func(t *testing.T) { + t.Parallel() + + got, err := lunatask.ParseRelationshipStrength(testCase.input) + if (err != nil) != testCase.wantErr { + t.Errorf("ParseRelationshipStrength(%q) error = %v, wantErr %v", testCase.input, err, testCase.wantErr) + + return + } + + if !testCase.wantErr && got != testCase.want { + t.Errorf("ParseRelationshipStrength(%q) = %q, want %q", testCase.input, got, testCase.want) + } + }) + } +}