access.go

 1// Package access defines access control levels and permissions for repositories and users.
 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}