{-# LANGUAGE OverloadedStrings #-} module Geolite.Csv where import Data.Text (Text) import Pipes (Pipe) import Colonnade.Types import Geolite.Types import qualified Data.Text as Text import qualified Net.IPv4.Range.Text as IPv4RangeText import qualified Data.Text.Read as TextRead import qualified Siphon.Decoding as SD import qualified Siphon.Content as SC import qualified Colonnade.Decoding.Text as CDT import qualified Colonnade.Decoding as CD cities :: Monad m => Pipe Text City m (DecodingRowError Headed Text) cities = SD.headedPipe SC.text decodingCity blocks :: Monad m => Pipe Text Block m (DecodingRowError Headed Text) blocks = SD.headedPipe SC.text decodingBlock decodingCity :: Decoding Headed Text City decodingCity = City <$> fmap GeonameId (CD.headed "geoname_id" CDT.int) <*> CD.headed "locale_code" CDT.text <*> CD.headed "continent_code" CDT.text <*> CD.headed "continent_name" CDT.text <*> CD.headed "country_iso_code" CDT.text <*> CD.headed "country_name" CDT.text <*> CD.headed "subdivision_1_iso_code" CDT.text <*> CD.headed "subdivision_1_name" CDT.text <*> CD.headed "subdivision_2_iso_code" CDT.text <*> CD.headed "subdivision_2_name" CDT.text <*> CD.headed "city_name" CDT.text <*> CD.headed "metro_code" (CDT.optional CDT.int) <*> CD.headed "time_zone" CDT.text decodingBlock :: Decoding Headed Text Block decodingBlock = Block <$> CD.headed "network" IPv4RangeText.decodeEither <*> CD.headed "geoname_id" (CDT.optional $ CDT.map GeonameId CDT.int) <*> CD.headed "registered_country_geoname_id" (CDT.optional $ CDT.map GeonameId CDT.int) <*> CD.headed "represented_country_geoname_id" (CDT.optional $ CDT.map GeonameId CDT.int) <*> CD.headed "is_anonymous_proxy" (CDT.trueFalse "1" "0") <*> CD.headed "is_satellite_provider" (CDT.trueFalse "1" "0") <*> CD.headed "postal_code" CDT.text <*> CD.headed "latitude" (CDT.optional $ CDT.fromReader TextRead.rational) <*> CD.headed "longitude" (CDT.optional $ CDT.fromReader TextRead.rational) <*> CD.headed "accuracy_radius" (CDT.optional CDT.int)