aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReto Brunner <reto@labrat.space>2020-01-04 21:13:50 +0100
committerDrew DeVault <sir@cmpwn.com>2020-01-05 16:02:44 -0500
commit19dfc49481c6c8271115658c46ea68a1c977f1d0 (patch)
tree2ac4bec0a40d39e635619b7036400a2b3e9deb35
parent126119c0b1a5dc1da11c930769c03ff0a7f33fa8 (diff)
models: add BodyStructure.PartAtIndex
-rw-r--r--models/models.go33
1 files changed, 33 insertions, 0 deletions
diff --git a/models/models.go b/models/models.go
index fa3baf2..036a609 100644
--- a/models/models.go
+++ b/models/models.go
@@ -87,6 +87,39 @@ type BodyStructure struct {
DispositionParams map[string]string
}
+//PartAtIndex returns the BodyStructure at the requested index
+func (bs *BodyStructure) PartAtIndex(index []int) (*BodyStructure, error) {
+ if len(index) == 0 {
+ return bs, nil
+ }
+ cur := index[0]
+ rest := index[1:]
+ // passed indexes are 1 based, we need to convert back to actual indexes
+ curidx := cur - 1
+ if curidx < 0 {
+ return nil, fmt.Errorf("invalid index, expected 1 based input")
+ }
+
+ // no children, base case
+ if len(bs.Parts) == 0 {
+ if len(rest) != 0 {
+ return nil, fmt.Errorf("more index levels given than available")
+ }
+ if cur == 1 {
+ return bs, nil
+ } else {
+ return nil, fmt.Errorf("invalid index %v for non multipart", cur)
+ }
+ }
+
+ if cur > len(bs.Parts) {
+ return nil, fmt.Errorf("invalid index %v, only have %v children",
+ cur, len(bs.Parts))
+ }
+
+ return bs.Parts[curidx].PartAtIndex(rest)
+}
+
type Envelope struct {
Date time.Time
Subject string