perlにもConfig::Pitあるし、Pythonにもあるしという状況なので、Haskellでネットワークのちょろっとしたものを書くときにもパスワードをハードコードしないで、pitのやつを使いたかった。
module HsPit (
pitGet,
pitSet
)
where
import System.FilePath ((</>))
import System.Directory
import Data.Yaml.Syck
pitGet :: String -> IO [(String,String)]
pitGet query = do
home <- getHomeDirectory
do yaml <- parseYamlFile (home </> ".pit" </> "default.yaml")
case n_elem yaml of
EMap list -> return $ map (\keyval -> (,) ((fromYaml . fst) keyval) ((fromYaml . snd) keyval)) $ concatMap (fromEMap . snd) $ filter checkElem list
where checkElem ynode = ((n_elem . fst) ynode) == (EStr (packBuf query))
otherwise -> return []
where
fromYaml MkNode {n_elem=EStr str} = unpackBuf str
fromEMap MkNode {n_elem=EMap nodes} = nodes
pitSet = error "Not implemented"
HsSyckの使い方はPugsのYamlコードを参考にした。
で、例えばtwitterでつぶやくときには
import Network.HTTP
import Network.URI
import Codec.Binary.Base64.String
import Data.Maybe
import HsPit
tweet username password msg = simpleHTTP req where
req = Request uri POST [ah] "" where
ah = Header HdrAuthorization $ "Basic " ++ encode (username ++ ":" ++ password)
uri = fromJust $ parseURI $ "http://twitter.com/statuses/update.xml?"
++ urlEncodeVars [("status", msg)]
main = do
userdata <- pitGet "twitter"
case lookup "username" userdata of Just username ->
case lookup "password" userdata of Just password ->
tweet username password "tWeet"
なんかごちゃごちゃとしてしまった。