member_group.gno
2.84 Kb · 123 lines
1package commondao
2
3import (
4 "errors"
5 "strings"
6)
7
8// MemberGroup defines an interface for a group of members.
9type MemberGroup interface {
10 // Name returns the name of the group.
11 Name() string
12
13 // Members returns the members that belong to the group.
14 Members() MemberStorage
15
16 // SetMeta sets any metadata relevant to the group.
17 // Metadata can be used to store data which is specific to the group.
18 // Usually can be used to store parameter values which would be useful
19 // during proposal voting or tallying to resolve things like voting
20 // weights or rights for example.
21 SetMeta(any)
22
23 // GetMeta returns the group metadata.
24 GetMeta() any
25}
26
27// NewMemberGroup creates a new group of members.
28func NewMemberGroup(name string, members MemberStorage) (MemberGroup, error) {
29 if members == nil {
30 return nil, errors.New("member storage is required")
31 }
32
33 name = strings.TrimSpace(name)
34 if name == "" {
35 return nil, errors.New("member group name is required")
36 }
37
38 return &memberGroup{
39 name: name,
40 members: members,
41 }, nil
42}
43
44// MustNewMemberGroup creates a new group of members or panics on error.
45func MustNewMemberGroup(name string, members MemberStorage) MemberGroup {
46 g, err := NewMemberGroup(name, members)
47 if err != nil {
48 panic(err)
49 }
50 return g
51}
52
53type memberGroup struct {
54 name string
55 members MemberStorage
56 meta any
57}
58
59// Name returns the name of the group.
60func (g memberGroup) Name() string {
61 return g.name
62}
63
64// Members returns the members that belong to the group.
65func (g memberGroup) Members() MemberStorage {
66 return g.members
67}
68
69// SetMeta sets any metadata relevant to the group.
70func (g *memberGroup) SetMeta(meta any) {
71 g.meta = meta
72}
73
74// GetMeta returns the group metadata.
75func (g memberGroup) GetMeta() any {
76 return g.meta
77}
78
79// NewReadonlyMemberGroup creates a new readonly member group.
80func NewReadonlyMemberGroup(g MemberGroup) (*ReadonlyMemberGroup, error) {
81 if g == nil {
82 return nil, errors.New("member group is required")
83 }
84 return &ReadonlyMemberGroup{g}, nil
85}
86
87// MustNewReadonlyMemberGroup creates a new readonly member group or panics on error.
88func MustNewReadonlyMemberGroup(g MemberGroup) *ReadonlyMemberGroup {
89 group, err := NewReadonlyMemberGroup(g)
90 if err != nil {
91 panic(err)
92 }
93 return group
94}
95
96// ReadonlyMemberGroup defines a readonly member group.
97type ReadonlyMemberGroup struct {
98 group MemberGroup
99}
100
101// Name returns the name of the group.
102func (g ReadonlyMemberGroup) Name() string {
103 if g.group == nil {
104 return ""
105 }
106 return g.group.Name()
107}
108
109// Members returns the members that belong to the group.
110func (g ReadonlyMemberGroup) Members() *ReadonlyMemberStorage {
111 if g.group == nil {
112 return nil
113 }
114 return MustNewReadonlyMemberStorage(g.group.Members())
115}
116
117// GetMeta returns the group metadata.
118func (g ReadonlyMemberGroup) GetMeta() any {
119 if g.group == nil {
120 return nil
121 }
122 return g.group.GetMeta()
123}