Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}