1package identity
2
3import (
4 "encoding/json"
5 "fmt"
6 "strings"
7
8 "github.com/MichaelMure/git-bug/util/lamport"
9 "github.com/MichaelMure/git-bug/util/text"
10)
11
12type Bare struct {
13 name string
14 email string
15 login string
16 avatarUrl string
17}
18
19func NewBare(name string, email string) *Bare {
20 return &Bare{name: name, email: email}
21}
22
23func NewBareFull(name string, email string, login string, avatarUrl string) *Bare {
24 return &Bare{name: name, email: email, login: login, avatarUrl: avatarUrl}
25}
26
27type bareIdentityJson struct {
28 Name string `json:"name,omitempty"`
29 Email string `json:"email,omitempty"`
30 Login string `json:"login,omitempty"`
31 AvatarUrl string `json:"avatar_url,omitempty"`
32}
33
34func (i Bare) MarshalJSON() ([]byte, error) {
35 return json.Marshal(bareIdentityJson{
36 Name: i.name,
37 Email: i.email,
38 Login: i.login,
39 AvatarUrl: i.avatarUrl,
40 })
41}
42
43func (i Bare) UnmarshalJSON(data []byte) error {
44 aux := bareIdentityJson{}
45
46 if err := json.Unmarshal(data, &aux); err != nil {
47 return err
48 }
49
50 i.name = aux.Name
51 i.email = aux.Email
52 i.login = aux.Login
53 i.avatarUrl = aux.AvatarUrl
54
55 return nil
56}
57
58func (i Bare) Name() string {
59 return i.name
60}
61
62func (i Bare) Email() string {
63 return i.email
64}
65
66func (i Bare) Login() string {
67 return i.login
68}
69
70func (i Bare) AvatarUrl() string {
71 return i.avatarUrl
72}
73
74func (i Bare) Keys() []Key {
75 return []Key{}
76}
77
78func (i Bare) ValidKeysAtTime(time lamport.Time) []Key {
79 return []Key{}
80}
81
82// DisplayName return a non-empty string to display, representing the
83// identity, based on the non-empty values.
84func (i Bare) DisplayName() string {
85 switch {
86 case i.name == "" && i.login != "":
87 return i.login
88 case i.name != "" && i.login == "":
89 return i.name
90 case i.name != "" && i.login != "":
91 return fmt.Sprintf("%s (%s)", i.name, i.login)
92 }
93
94 panic("invalid person data")
95}
96
97// Match tell is the Person match the given query string
98func (i Bare) Match(query string) bool {
99 query = strings.ToLower(query)
100
101 return strings.Contains(strings.ToLower(i.name), query) ||
102 strings.Contains(strings.ToLower(i.login), query)
103}
104
105// Validate check if the Identity data is valid
106func (i Bare) Validate() error {
107 if text.Empty(i.name) && text.Empty(i.login) {
108 return fmt.Errorf("either name or login should be set")
109 }
110
111 if strings.Contains(i.name, "\n") {
112 return fmt.Errorf("name should be a single line")
113 }
114
115 if !text.Safe(i.name) {
116 return fmt.Errorf("name is not fully printable")
117 }
118
119 if strings.Contains(i.login, "\n") {
120 return fmt.Errorf("login should be a single line")
121 }
122
123 if !text.Safe(i.login) {
124 return fmt.Errorf("login is not fully printable")
125 }
126
127 if strings.Contains(i.email, "\n") {
128 return fmt.Errorf("email should be a single line")
129 }
130
131 if !text.Safe(i.email) {
132 return fmt.Errorf("email is not fully printable")
133 }
134
135 if i.avatarUrl != "" && !text.ValidUrl(i.avatarUrl) {
136 return fmt.Errorf("avatarUrl is not a valid URL")
137 }
138
139 return nil
140}
141
142func (i Bare) IsProtected() bool {
143 return false
144}