Context
Every read module under `internal/` (mailaccount, mailforward, mailfilter, mailinglist, account, server, domain, subdomain, dns, database, …) defines its own copy of `getString` / `getFloat` (and sometimes `getInt`) helpers around `soap.Value.Get`. They are byte-identical and grow with each new slice.
Proposal
Add a small internal helper package — e.g. `internal/soap/mapx` or expose `soap.Value` accessor methods like `MapString(key) string`, `MapFloat(key) float64`, `MapInt(key) int` — and migrate every read module to it in a single refactor PR.
Constraints / non-goals
Surfaced during the code-review of PR #55 (databases read slice).
Context
Every read module under `internal/` (mailaccount, mailforward, mailfilter, mailinglist, account, server, domain, subdomain, dns, database, …) defines its own copy of `getString` / `getFloat` (and sometimes `getInt`) helpers around `soap.Value.Get`. They are byte-identical and grow with each new slice.
Proposal
Add a small internal helper package — e.g. `internal/soap/mapx` or expose `soap.Value` accessor methods like `MapString(key) string`, `MapFloat(key) float64`, `MapInt(key) int` — and migrate every read module to it in a single refactor PR.
Constraints / non-goals
Surfaced during the code-review of PR #55 (databases read slice).