{-# LANGUAGE RecordWildCards, OverloadedStrings #-} import Network.Wreq (get, responseBody) import Data.Aeson (decode, toJSON) import Data.Maybe (fromJust) import Data.HashMap.Strict (delete) import Control.Monad (when) import Control.Lens import Control.Applicative import qualified Data.ByteString.Lazy.Char8 as C import System.Console.ArgParser import System.Process import Json data ProgArgs = ProgArgs { name :: String , url :: String , local :: Bool , block :: Bool , raw :: Bool } deriving (Show) parser :: ParserSpec ProgArgs parser = ProgArgs `parsedBy` reqPos "name" `Descr` "Namecoin name id" `andBy` optFlag "http://dns.dnschain.net/" "url" `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" interface :: IO (CmdLnInterface ProgArgs) interface = (`setAppDescr` "Query the namecoin blockchain") <$> (`setAppEpilog` "Stat rosa pristina nomine, nomina nuda tenemus.") <$> mkApp parser exec :: ProgArgs -> IO () exec args@ProgArgs{..} = 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" main :: IO () main = interface >>= flip runApp exec