Как вы вкладываете разные директивы по распылению в одну директиву?
Допустим, у меня есть 1 директива для аутентификации. И после аутентификации я хотел бы войти. Это то, что я делаю до сих пор:
get(...) {
myauthdirective() { v =>
myloggingdirective(v) {
...
}
}
}
Поэтому я хотел бы преобразовать это в одну директиву вместо того, чтобы иметь 2 каждый раз, когда мне нужно аутентифицироваться.
Я попытался использовать плоскую карту, но это, похоже, не работает, потому что authenticate возвращает Directive1, а logRequestResponse возвращает Directive0.
// Does not work!
authenticate(myAuthMagnet).flatMap {
case ca: returnType => logRequestResponse(LoggingMagnet(logme(ca)))
}
Так что я попробовал это с картой, но это, похоже, не входит в мою функцию магнита.
// Does not work either!
authenticate(myAuthMagnet).map {
case ca: returnType =>
logRequestResponse(LoggingMagnet(logme(ca))) // does not go into logme function for some reason
ca
}
Я также не могу вызвать logme напрямую, потому что мне также нужны объекты запроса и ответа.
Есть ли способ создать новую директиву с двумя директивами, которые возвращают разные типы директив? Благодарю.
1 ответ
В вашей реализации отсутствует одна маленькая вещь. Вы должны предоставить значение после регистрации. Так что реализация должна быть такой:
authenticate(myAuthMagnet).flatMap {
case ca: returnType => logRequestResponse(LoggingMagnet(logme(ca))) & provide(ca)
}