diff options
Diffstat (limited to 'src/foundation.gentoo.org/golang/members/maintenance/memberroll.go')
-rw-r--r-- | src/foundation.gentoo.org/golang/members/maintenance/memberroll.go | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/foundation.gentoo.org/golang/members/maintenance/memberroll.go b/src/foundation.gentoo.org/golang/members/maintenance/memberroll.go new file mode 100644 index 0000000..05017ea --- /dev/null +++ b/src/foundation.gentoo.org/golang/members/maintenance/memberroll.go @@ -0,0 +1,73 @@ +package maintenance + +import ( + "io/ioutil" + + "github.com/golang/protobuf/proto" + pb "foundation.gentoo.org/golang/members/data" +) + +// Struct MemberRoll defines operations on a MemberRoll +// and holds the underlying data. +type MemberRoll struct { + roll *pb.MemberRoll +} + +// Create a new memberRoll from a file. +func NewMemberRoll (path string) (*MemberRoll, error) { + in, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + // something + } + r := &pb.MemberRoll{} + if err = proto.Unmarshal(in, r); err != nil { + return nil, err + // something + } + mr := &MemberRoll{roll: r} + return mr, nil +} + +// NewEmptyMemberRoll creates an empty MemberRoll +func NewEmptyMemberRoll() (*MemberRoll) { + // The first member gets ID 1. + return &MemberRoll{ + roll: &pb.MemberRoll { + NextMemberId: proto.Int64(1), + }, + } +} + +// Save will write the MemberRoll to file at path. +func (mr *MemberRoll) Save(path string) (bool, error) { + bytes, err := proto.Marshal(mr.roll) + if err != nil { return false, err } + if err = ioutil.WriteFile(path, bytes, 0644); err != nil { + return false, err + } + return true, nil +} + +// GetMaxMemberId computes the largest ID amongst a memberroll. +// This works by assuming members are not removed from a roll. +func (mr *MemberRoll) GetMaxMemberId() (int64) { + var id int64 = 0; + for _, member := range (mr.roll.GetMembers()) { + member_id := member.GetId() + if member_id > id { + id = member_id + } + } + return id +} + +func (mr *MemberRoll) GetNextMemberId() (int64) { + id := mr.GetNextMemberId() + // If the member roll lost its ID (not a required field.) + // Recalculate based on existing membership. + if id == 0 { + id = mr.GetMaxMemberId() + } + return id +} |