summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/foundation.gentoo.org/golang/members/maintenance/memberroll.go')
-rw-r--r--src/foundation.gentoo.org/golang/members/maintenance/memberroll.go73
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
+}