authentricity/internal/models/names.go
2022-07-11 21:49:26 +00:00

42 lines
716 B
Go

package models
import (
"fmt"
"regexp"
"strings"
"github.com/google/uuid"
)
var (
// Strict Mode RE from https://systemd.io/USER_NAMES/,
// which seems about as sensible as anything
usernameRe = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_-]{0,30}$")
)
type NameClass int
const (
nameClassUnknown NameClass = iota
NameClassUUID
NameClassUsername
NameClassEmail
)
func ClassifyName(name string) (NameClass, error) {
if usernameRe.MatchString(name) {
return NameClassUsername, nil
}
_, err := uuid.Parse(name)
if err == nil {
return NameClassUUID, nil
}
if strings.Contains(name, "@") {
return NameClassEmail, nil
}
return nameClassUnknown, fmt.Errorf("%w '%s'", ErrInvalidName, name)
}