{-# 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 qualified Data.ByteString.Lazy.Char8 as C import System.Console.ArgParser import System.Process import Json data Name = Name { name :: String , url :: String , local :: Bool , block :: Bool , raw :: Bool } deriving (Show) parser :: ParserSpec Name parser = Name `parsedBy` reqPos "name" `Descr` "Namecoin name id" `andBy` optPos "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" main :: IO () main = mkApp parser >>= flip runApp exec exec :: Name -> IO () exec args@Name{..} = 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"