我有一个使用Servant库编写的服务器。现在,我希望使端点成为有条件的,以便基于某些配置或逻辑,我想服务(或不服务)特定的端点。最好的方法是什么?
我已经尝试使用EmptyAPI
中的Servant.API
,但没有用。对于上下文,我目前大部分路线都使用toServant
中的Servant.API.Generic
。
如果在端点“关闭”时可以返回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
...
}