{-# LANGUAGE TemplateHaskell, OverloadedStrings #-}
module Ham.Fcc
(fccLookup',
fccLookup,
fccLookupName,
fccLicenseFromResult,
FccResult,
FccLicense(..),
FccLicenses,
licenses
) where
import Network.HTTP
import Data.Aeson
import Data.Aeson.TH
import Data.Array
import Data.Char (toLower)
import Data.Maybe (listToMaybe)
import qualified Data.Text as T
import Data.Text (Text)
import qualified Data.ByteString.Lazy as B
import qualified Data.HashMap.Strict as H
import Ham.Internal.Fcc
type Address = String
type Name = String
$(deriveJSON defaultOptions ''FccLicense)
instance FromJSON FccResult where
parseJSON (Object v) = FccResult
<$> v .: "status"
<*> v .: "Licenses"
instance FromJSON FccLicenses where
parseJSON (Object v) = FccLicenses
<$> v .: "lastUpdate"
<*> v .: "page"
<*> v .: "totalRows"
<*> v .: "License"
<*> v .: "rowPerPage"
fccLookup' :: Text
-> IO (Maybe FccResult)
fccLookup' callsign = do
let rq_string = "http://data.fcc.gov/api/license-view/basicSearch/getLicenses?searchValue=" ++ T.unpack callsign ++ "&format=json"
r <- simpleHTTP $ getRequest rq_string
case r of
Left err -> return Nothing
Right response -> do
let o = decode (B.pack $ map (fromIntegral . fromEnum) $ rspBody response) :: Maybe Object
let eo2 = eitherDecode (B.pack $ map (fromIntegral . fromEnum) $ rspBody response) :: Either String FccResult
case eo2 of
Right a -> return $ Just a
Left s -> putStrLn s >> return Nothing
fccLookup :: Text -> IO (Maybe FccLicense)
fccLookup cs = do { a <- fccLookup' cs; return $ a >>= fccLicenseFromResult }
fccLookupName :: Text -> IO Text
fccLookupName cs = do
a <- fccLookup' cs
maybe (return "") (return . T.pack . licName) (a >>= fccLicenseFromResult)
fccLicenseFromResult :: FccResult -> Maybe FccLicense
fccLicenseFromResult r = listToMaybe ls
where ls = license $ licenses r
active_ls = filter (( == "active") . map toLower . statusDesc) ls