member_group.gno
1.74 Kb ยท 77 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}