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