Как реализовать условные конечные точки с помощью Servant? - PullRequest
0 голосов
/ 15 января 2020

У меня есть существующий сервер, написанный с использованием библиотеки Servant. Теперь я хочу сделать конечные точки условными, чтобы на основании определенной конфигурации или логики c я хотел бы обслуживать (или не обслуживать) конкретную конечную точку. Какой лучший способ сделать это?

Я пытался использовать EmptyAPI из Servant.API, но это не сработало. Для контекста я в настоящее время использую toServant из Servant.API.Generic для большинства моих маршрутов.

1 Ответ

2 голосов
/ 15 января 2020

Если все в порядке с возвратом 404, когда конечная точка выключена, вы можете сделать это, выдав соответствующую ошибку Servant:

server = toServant MyEndpointsRecord
    { ...

    , cleverEndpoint = do
        shouldServe <- isCleverEndpointEnabled
        if shouldServe 
            then serveCleverEndpoint
            else throwError err404

    ...
    }

Вы также можете обернуть это для повторного использования, если вам нужно делайте это часто:

guarded checkConfig f = do
    shouldServe <- checkConfig
    if shouldServe 
        then f
        else throwError err404


server = toServant MyEndpointsRecord
    { ...

    , cleverEndpoint = guarded isCleverEndpointEnabled serveCleverEndpoint

    ...
    }
...