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}