datatype listing =
Error of string
- | Listing of string list
+ | Listing of {user : string, mailbox : string} list
fun list domain =
let
NONE => Listing (rev users)
| SOME line =>
case String.tokens Char.isSpace line of
- [addr, _] =>
+ [addr, fields] =>
(case String.fields (fn ch => ch = #"@") addr of
- [user, _] => loop (user :: users)
+ [user, _] =>
+ let
+ fun parseFields fields =
+ case fields of
+ "mail" :: mailbox :: _ => loop ({user = user, mailbox = mailbox} :: users)
+ | _ :: _ :: rest => parseFields rest
+ | _ => Error "Invalid fields in database"
+ in
+ parseFields (String.fields (fn ch => ch = #"|" orelse ch = #"=") fields)
+ end
| _ => Error "Invalid e-mail address format in database")
| _ => Error "Invalid entry in database"
in