如何使用 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
...
}
我有一个使用 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
...
}