Сократите дублирование в Haskell Servant

Проект, над которым я работаю, включает вызов CloudFlare API. Я уже определил API с помощью Servant (клиент), и я могу сделать из него клиента. Однако для CloudFlare API требуются заголовки аутентификации, поэтому все мои типы API заканчиваются дублированием. Есть ли способ избавиться от тех, которые находятся на уровне типа? Я доволен, что функции, полученные от клиента, требуют этих параметров.

Пример кода:

type ListZones = "zones"
  :> Header "X-Auth-Email" Text
  :> Header "X-Auth-Key" Text
  :> Get '[JSON] (Result [Zone])

type ListRecords = "zones"
  :> Header "X-Auth-Email" Text
  :> Header "X-Auth-Key" Text
  :> Capture "zone_uuid" Text
  :> "dns_records"
  :> Get '[JSON] (Result [Record])

type CreateRecord = "zones"
  :> Header "X-Auth-Email" Text
  :> Header "X-Auth-Key" Text
  :> Capture "zone_uuid" Text
  :> "dns_records"
  :> ReqBody '[JSON] Record
  :> Post '[JSON] (Result Record)

type UpdateRecord = "zones"
  :> Header "X-Auth-Email" Text
  :> Header "X-Auth-Key" Text
  :> Capture "zone_uuid" Text
  :> "dns_records"
  :> Capture "record_uuid" Text
  :> ReqBody '[JSON] Record
  :> Patch '[JSON] (Result Record)

haskell,servant,

1

Ответов: 1


1

Я считаю, что вы захотите вытащить общие биты так же, как описано здесь: http://www.parsonsmatt.org/2018/03/14/servant_route_smooshing.html

Он идет от:

type Api
    = "player" 
        :> Capture "playerId" Int 
        :> "x" 
        :> Get '[JSON] Int
    :<|> "player" 
        :> Capture "playerId" Int 
        :> "y" 
        :> Get '[JSON] Int

в

type Api'
    = "player" 
    :> Capture "playerId" Int
    :> (     "y" :> Get '[JSON] Int
        :<|> "x" :> Get '[JSON] Int
       )

который проще, чем вам нужно, но показывает, как начать работу.

Надеюсь, это поможет.

Haskell, слуга,
Похожие вопросы