Как вы вкладываете разные директивы по распылению в одну директиву?

Допустим, у меня есть 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)
}
Другие вопросы по тегам