main
関数内でコマンドライン引数を読んだとして、ハンドラからどうやってアクセスするのか悩んだので以下に方法を書いておきます。
tl;dr
ファウンデーション型のフィールドにデータを格納しgetYesod
でアクセスする。
Initializing data in the foundation datatype :: Yesod Web Framework Book- Version 1.6
注:ファウンデーション型というのはYesod
のインスタンスにするデータ型のことです。以下のコードではArgument
にあたります。
ハンドラからコマンドライン引数にアクセスする例
以下は、引数付きでWebアプリを起動すると、/
にアクセスしたときそれらをhtml内で表示するという例です。
やっていることはtl;drにある通りです。
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import System.Environment (getArgs)
import Yesod
data Argument = Argument { args :: [String] }
mkYesod "Argument" [parseRoutes|
/ HomeR GET
|]
instance Yesod Argument
getHomeR :: Handler Html
getHomeR = do
args <- args <$> getYesod
defaultLayout $ do
setTitle "Argument"
[whamlet|
$forall arg <- args
<p>#{arg}
|]
main :: IO ()
main = do
args <- getArgs
warp 3000 (Argument args)
関連技術
optparse-applicative - コマンドライン引数を扱うライブラリ
optparse-generic - 上と同じだがよりシンプル
RecordWildcards
拡張 - レコードのフィールドを扱うのに便利。上で挙げたYesod Bookに使用例があります。