60 lines
2.1 KiB
Haskell
60 lines
2.1 KiB
Haskell
{-# 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)
|
|
|
|
|