rosa/Main.hs

57 lines
1.8 KiB
Haskell
Raw Normal View History

2014-11-21 23:05:16 +01:00
{-# LANGUAGE RecordWildCards, OverloadedStrings #-}
2014-11-21 00:14:57 +01:00
2014-11-21 23:05:16 +01:00
import Network.Wreq (get, responseBody)
import Data.Aeson (decode, toJSON)
import Data.Maybe (fromJust)
import Data.HashMap.Strict (delete)
import Control.Monad (when)
2014-11-20 21:39:25 +01:00
import Control.Lens
2014-11-21 23:05:16 +01:00
import qualified Data.ByteString.Lazy.Char8 as C
import System.Console.ArgParser
import System.Process
2014-11-20 21:39:25 +01:00
2014-11-22 17:16:33 +01:00
import Json
2014-11-21 23:05:16 +01:00
2014-11-22 17:16:33 +01:00
data ProgArgs = ProgArgs
2014-11-22 15:52:47 +01:00
{ name :: String
, url :: String
, local :: Bool
, block :: Bool
, raw :: Bool
} deriving (Show)
2014-11-21 00:14:57 +01:00
2014-11-22 17:16:33 +01:00
parser :: ParserSpec ProgArgs
parser = ProgArgs
2014-11-22 15:52:47 +01:00
`parsedBy` reqPos "name" `Descr` "Namecoin name id"
2014-11-23 15:01:02 +01:00
`andBy` optFlag "http://dns.dnschain.net/" "url"
2014-11-22 15:52:47 +01:00
`Descr` "Use custom dnschain API url"
`andBy` boolFlag "local" `Descr` "Use local namecoind db"
`andBy` boolFlag "block" `Descr` "Show blockchain data (require local connecton)"
`andBy` boolFlag "raw" `Descr` "Print raw JSON data"
2014-11-21 00:14:57 +01:00
2014-11-22 17:16:33 +01:00
exec :: ProgArgs -> IO ()
exec args@ProgArgs{..} =
2014-11-22 15:52:47 +01:00
if local
then do
out <- readProcess "namecoind" ["name_show", name] ""
case decode (C.pack out) of
Just res -> do
putStrLn (repr value)
when block $ putStrLn (repr extra)
where
value = fromJust . decode . C.pack $ res |: "value"
extra = toJSON $ delete "value" res
Nothing -> putStrLn "Error parsing data"
else do
req <- get (url ++ name)
let body = req ^. responseBody
if raw
then print body
else putStrLn $
case decode body of
Just res -> repr res
Nothing -> "Error parsing data"
2014-11-22 17:16:33 +01:00
main :: IO ()
main = mkApp parser >>= flip runApp exec