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}