ハンドラーに対応する現在のルートを取得したいと思います。参考までに、私のサーバーのモックアップを次に示します。
type ServerAPI =
"route01" :> Get '[HTML] Text
:<|> "route02" :> "subroute" :> Get '[HTML] Text
:<|> "route03" :> Get '[HTML] Text
そして、ここにいくつかのハンドラがあります:
route1and2Handler :: Handler Text
route1and2Handler = do
route <- getCurrentRoute
addVisitCountForRouteToDatabaseOrSomethingOfThatSort...
return template
route3Handler :: Handler Text
route3Handler = return "Hello, I'm route 03"
そして私のサーバー:
server :: Server ServerAPI
server = route1and2Handler :<|> route1and2Handler :<|> route3Handler
したがって、基本的に、route1and2Handler
現在のルートを取得する方法が必要です。HasServer
次のようにインスタンスを実装することにより、リクエストオブジェクトをハンドラーに取得し、そこからURLを抽出しようとしました:
data FullRequest
instance HasServer a => HasServer (FullRequest :> a) where
type Server (FullRequest :> a) = Request -> Server a
route Proxy subserver request respond =
route (Proxy :: Proxy a) (subserver request) request respond
[編集]サーバントの古いバージョンの API を見ていたことに気付きましたが、これはもはや有効ではありません。Newroute
には の型シグネチャがroute :: Proxy api -> Context context -> Delayed env (Server api) -> Router env
あり、ここから取得する方法が実際にはわかりませんRequest
。
そして、route1and2Handler
型シグネチャを にするよりも、インスタンスRequest -> Handler Text
を作成しようとするとこのエラーが発生します:HasServer
`Server' is not a (visible) associated type of class `HasServer'
最後に指摘しておくと、私の最終的な目標は、 内から現在のルートを取得することHandler
です。ルートの訪問回数をデータベースに追加するのは、単なる例です。訪問数をカウントするより良い方法などには興味がありません。