Johan Basson
11/16/2019, 6:40 AMfun authenticate(
request: AuthenticateRequest,
secretKey: SecretKey,
con: Connection
): Either<ErrorMessage, Token>> = Either.fx {
val (optUser) = getUserByUsername(con, request.username)
val (user) = checkUserExists(optUser)
val (_) = checkPassword(request.password, user)
val (token) = generateToken(user, secretKey)
token
}
In this case secretKey and Connection is dependencies
From what I understand you can use the Reader monad to inject it from the top of the application:
fun authenticate(request: AuthenticateRequest): Reader<Context, Either<ErrorMessage, Token>> {
return ReaderApi.ask<Context>().map { ctx ->
Either.fx {
val (optUser) = getUserByUsername(ctx.sql2o, request.username)
val (user) = checkUserExists(optUser)
val (_) = checkPassword(request.password, user)
val (token) = generateToken(user, ctx.secretKey)
token
}
}
}
But this does not seem to compilesimon.vergauwen
11/16/2019, 9:47 AMEither.fx
but I got a IDEA warning and compile error on that.
import arrow.core.Either
import arrow.core.extensions.fx
import arrow.mtl.Reader
import arrow.mtl.ReaderApi
import arrow.mtl.map
object AuthenticateRequest
object Context
object ErrorMessage
object Token
fun authenticate(request: AuthenticateRequest): Reader<Context, Either<ErrorMessage, Token>> =
ReaderApi.ask<Context>().map { ctx ->
Either.fx<ErrorMessage, Token> {
Token
}
}