packages feed

rosa-0.1.0.0: Main.hs

{-# 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 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`    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"

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 = mkApp parser >>= flip runApp exec