{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} module Data.Aviation.WX.Fetcher( parseWeather , fetchMetar ) where import Data.Attoparsec.Text(parseOnly) import Data.Aviation.WX(Weather, weatherParser) import Data.Char(toUpper, isAlpha) import Data.Text(Text, pack) import Network.HTTP(simpleHTTP, getRequest, getResponseBody) type ICAOStationDesignator = String -- | Parse the given METAR text. parseWeather :: Text -> Either String Weather parseWeather = parseOnly weatherParser fetchMetar :: ICAOStationDesignator -> IO (Either String Weather) fetchMetar icao = do let icao' = map toUpper . filter isAlpha $ icao metarString <- simpleHTTP (getRequest $ url icao') >>= getResponseBody let wx' = pack $ "METAR " ++ relLine metarString putStrLn $ "Parsing " ++ show wx' return $ parseWeather wx' where url designator = "http://tgftp.nws.noaa.gov/data/observations/metar/stations/" ++ designator ++ ".TXT" relLine s = Prelude.lines s !! 1