diff options
author | Reto Brunner <reto@labrat.space> | 2020-01-04 21:13:50 +0100 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2020-01-05 16:02:44 -0500 |
commit | 19dfc49481c6c8271115658c46ea68a1c977f1d0 (patch) | |
tree | 2ac4bec0a40d39e635619b7036400a2b3e9deb35 | |
parent | 126119c0b1a5dc1da11c930769c03ff0a7f33fa8 (diff) |
models: add BodyStructure.PartAtIndex
-rw-r--r-- | models/models.go | 33 |
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 |