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}