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 _ encoding.TextMarshaler = AccessLevel(0)
58var _ encoding.TextUnmarshaler = (*AccessLevel)(nil)
59
60// ErrInvalidAccessLevel is returned when an invalid access level is provided.
61var ErrInvalidAccessLevel = errors.New("invalid access level")
62
63// UnmarshalText implements encoding.TextUnmarshaler.
64func (a *AccessLevel) UnmarshalText(text []byte) error {
65	l := ParseAccessLevel(string(text))
66	if l < 0 {
67		return ErrInvalidAccessLevel
68	}
69
70	*a = l
71
72	return nil
73}
74
75// MarshalText implements encoding.TextMarshaler.
76func (a AccessLevel) MarshalText() (text []byte, err error) {
77	return []byte(a.String()), nil
78}