Raw
 1package identity
 2
 3import (
 4	"errors"
 5
 6	"tug/internal/service/password"
 7	"tug/internal/storage"
 8)
 9
10const (
11	PathLogin    = "login"
12	PathSudo     = "sudo"
13	PathPassword = "password"
14)
15
16var Paths = []string{PathLogin, PathSudo, PathPassword}
17
18const (
19	checkAccepted    = "accepted"
20	checkRejected    = "rejected"
21	checkLocked      = "locked"
22	checkBusy        = "busy"
23	checkUnavailable = "unavailable"
24)
25
26var CheckResults = []string{checkAccepted, checkRejected, checkLocked, checkBusy, checkUnavailable}
27
28func discard(string, string) {}
29
30func (s *Service) Observed(path string, observe func(path, result string)) *Service {
31	if observe == nil {
32		observe = discard
33	}
34	c := *s
35	c.path, c.observe = path, observe
36	return &c
37}
38
39func (s *Service) observed(user storage.User, err error) (storage.User, error) {
40	s.observe(s.path, checkResult(err))
41	return user, err
42}
43
44func checkResult(err error) string {
45	switch {
46	case err == nil:
47		return checkAccepted
48	case errors.Is(err, ErrRejected):
49		return checkRejected
50	case errors.Is(err, password.ErrBusy):
51		return checkBusy
52	}
53	return checkUnavailable
54}
55
56func (s *Service) Observer() func(path, result string) {
57	return s.observe
58}