bare.go

  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}