Как объединить несколько конечных точек в finch

Я пытаюсь составить несколько конечных точек вместе при запуске http-сервера. Несколько конечных точек определяются следующим образом:

  val foo = get("foo") { Ok("bar") }
  val test = get("test") { Ok("test") }

Этот код работает

  foo :+: test

Однако этот код не работает.

  List(foo, test).reduceLeft(_ :+: _)

Ошибка

 type mismatch;
 found   : io.finch.Endpoint[shapeless.:+:[String,shapeless.:+:[String,shapeless.CNil]]]
 required: io.finch.Endpoint[String]
 val controllers = List(foo, test).reduce(_ :+: _)
                                         ^

Я не совсем понимаю, почему reduce здесь не работает и как лучше всего комбинировать Endpoint в Finch


person Xiaohe Dong    schedule 04.06.2016    source источник
comment
Могу ли я предложить вам взглянуть на мой проект: github.com/akozhemiakin/finchrich Это может помочь вам объединяйте конечные точки менее подробным способом.   -  person Artyom Kozhemiakin    schedule 18.07.2016


Ответы (1)


почему сокращение здесь не работает

Если у вас есть x: Endpoint[String], y: Endpoint[String], то x :+: y возвращает Endpoint[Coproduct[String, String]]1 — важно, что он не того же типа, что и x или y

Взгляните на подпись reduce2:

List[A].reduce[A1 >: A](op: (A1, A1) ⇒ A1): A1

У вас есть List[Endpoint[String]] - op должен принимать аргументы x: Endpoint[String], y: Endpoint[String] и возвращать Endpoint[String], но :+: возвращает Endpoint[Coproduct[String, String]]

лучшая практика для объединения конечной точки в Finch

Я не использовал Finch, но все примеры в репозитории просто объединяют конечные точки с :+:

https://github.com/finagle/finch/blob/e3a62bf9a1cb26af40af428dd9be8b2dc3339c44/examples/src/main/scala/io/finch/todo/Main.scala#L83

getTodos :+: postTodo :+: deleteTodo :+: deleteTodos :+: patchTodo

Коллекции (такие как List) очень полезны, если вы собираетесь манипулировать элементами во время выполнения — вам нужно поддерживать этот вариант использования? Обычно я обнаружил, что знаю все свои маршруты во время компиляции.


1. Некоторые вольности были допущены с подписью типа CoproductCoproduct[String, String], а не shapeless.:+:[String, shapeless.:+:[String, shapeless.CNil]]

2. Аналогичный аргумент справедлив для reduceLeft

person wmmeyer    schedule 05.06.2016