如何使用 Servant 实现条件端点?

How to implement conditional endpoints with Servant?

我有一个使用 Servant 库编写的现有服务器。 我现在想让端点有条件,以便基于特定配置或逻辑,我想提供(或不提供)特定端点。 最好的方法是什么?

我试过使用 Servant.API 中的 EmptyAPI,但没有成功。 对于上下文,我目前在我的大部分路线中使用 Servant.API.Generic 中的 toServant

如果您可以在端点为 "off" 时返回 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

    ...
    }