1package access
2
3import (
4 "encoding"
5 "errors"
6)
7
8// AccessLevel is the level of access allowed to a repo.
9type AccessLevel int //nolint: revive
10
11const (
12 // NoAccess does not allow access to the repo.
13 NoAccess AccessLevel = iota
14
15 // ReadOnlyAccess allows read-only access to the repo.
16 ReadOnlyAccess
17
18 // ReadWriteAccess allows read and write access to the repo.
19 ReadWriteAccess
20
21 // AdminAccess allows read, write, and admin access to the repo.
22 AdminAccess
23)
24
25// String returns the string representation of the access level.
26func (a AccessLevel) String() string {
27 switch a {
28 case NoAccess:
29 return "no-access"
30 case ReadOnlyAccess:
31 return "read-only"
32 case ReadWriteAccess:
33 return "read-write"
34 case AdminAccess:
35 return "admin-access"
36 default:
37 return "unknown"
38 }
39}
40
41// ParseAccessLevel parses an access level string.
42func ParseAccessLevel(s string) AccessLevel {
43 switch s {
44 case "no-access":
45 return NoAccess
46 case "read-only":
47 return ReadOnlyAccess
48 case "read-write":
49 return ReadWriteAccess
50 case "admin-access":
51 return AdminAccess
52 default:
53 return AccessLevel(-1)
54 }
55}
56
57var (
58 _ encoding.TextMarshaler = AccessLevel(0)
59 _ encoding.TextUnmarshaler = (*AccessLevel)(nil)
60)
61
62// ErrInvalidAccessLevel is returned when an invalid access level is provided.
63var ErrInvalidAccessLevel = errors.New("invalid access level")
64
65// UnmarshalText implements encoding.TextUnmarshaler.
66func (a *AccessLevel) UnmarshalText(text []byte) error {
67 l := ParseAccessLevel(string(text))
68 if l < 0 {
69 return ErrInvalidAccessLevel
70 }
71
72 *a = l
73
74 return nil
75}
76
77// MarshalText implements encoding.TextMarshaler.
78func (a AccessLevel) MarshalText() (text []byte, err error) {
79 return []byte(a.String()), nil
80}