ini形式のデータをパースして値を取得できるようにします。また、ファイルが無いときの例外キャッチをできるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
{-# LANGUAGE ScopedTypeVariables #-} module Main where import qualified Data.HashMap as HM import qualified Data.Ini as Ini import qualified Data.Text as Tx import Control.Exception.Safe main::IO () main = do fi < - Ini.readIniFile "test.ini" `catch` (\(e::SomeException) -> do putStrLn $ displayException e return $ Ini.parseIni (Tx.pack "") ) case fi of Left fil -> putStrLn "" Right fir -> do putStrLn $ get (Tx.pack "あ") (Tx.pack "sessionId") fir putStrLn $ get (Tx.pack "い") (Tx.pack "sessionId") fir putStrLn $ getFromStr (Tx.pack "あ") return () where get::Tx.Text -> Tx.Text -> Ini.Ini -> String get section key ini = case Ini.lookupValue section key ini of Left l -> l Right r -> Tx.unpack r getFromStr::Tx.Text -> String getFromStr section = case Ini.parseIni (Tx.pack "[あ]\nhost=localhost\nport=6666\nsessionId=ない") of Left il -> il Right ir -> get section (Tx.pack "sessionId") ir |
1 2 3 4 5 6 7 8 9 10 |
~$ cat test.ini [あ] host=localhost port=6666 sessionId=0x0001 ~$ ./Main 0x0001 Couldn't find section: い < -- Left String ない ~$ |
lookupValueやparseIniは例外送出せず、値が見つからなき時はLeft Stringになります。
1 2 3 4 5 6 7 |
~$ rm test.ini ~$ ./Main test.ini: openFile: does not exist (No such file or directory) Couldn't find section: あ Couldn't find section: い ない ~$ |
catchはMonadCatchの型クラスを扱うためIOから抜けだせません。そのようなものなのでしょうか。理解できていません。
1 2 3 4 5 6 7 |
~$ cat test.ini sss ~$ ./Main Couldn't find section: あ Couldn't find section: い ない ~$ |
iniファイルのフォーマットに沿ってないファイル、単にセクションが見つからないだけです。パースはできています。
ちなみに実行ファイルサイズは4598736バイトでした。