| Unauthorized of AuthError
let login (username: string) (password: string) : Task<Result<AuthToken, LoginError>> =
let! user = username |> tryGetUser |> TaskResult.requireSome InvalidUser
do! user |> isPwdValid password |> Result.requireTrue InvalidPwd
do! user |> authorize |> TaskResult.mapError Unauthorized
return! user |> createAuthToken |> Result.mapError TokenErr