google-static-maps-0.3.0.0: src/Web/Google/Maps/Common.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
-- |
-- Module : Web.Google.Maps.Common
-- Description : Bindings to the Google Static Maps API
-- Copyright : (c) Mike Pilgrem 2017
-- Maintainer : public@pilgrem.com
-- Stability : experimental
--
-- This module has no connection with Google Inc. or its affiliates.
module Web.Google.Maps.Common
( -- * Functions
googleMapsApis
-- * Types
, Key (..)
, Location (..)
) where
import Data.Aeson (FromJSON)
import Data.Double.Conversion.Text (toFixed)
import Data.List (intersperse)
import Data.Text (Text)
import qualified Data.Text as T (concat)
import GHC.Generics (Generic)
import Servant.API (ToHttpApiData (..))
import Servant.Client (BaseUrl (..), Scheme (..))
-- | API key
newtype Key = Key Text
deriving (Eq, Show, ToHttpApiData)
-- | Location: precision in latitude or longitude beyond 6 decimal places is
-- ignored.
data Location = Location
{ lat :: Double -- ^ Takes any value between -90 and 90.
, lng :: Double -- ^ Takes any value between -180 and 180.
} deriving (Eq, Show, Generic)
instance ToHttpApiData Location where
toUrlPiece (Location lat' lng') = T.concat [toFixed precision lat', ",",
toFixed precision lng']
where
precision = 6 -- Precision beyond 6 decimal places is ignored.
instance ToHttpApiData [Location] where
toUrlPiece [] = ""
toUrlPiece ls = T.concat $ intersperse pipe $ map toUrlPiece ls
where
pipe = toUrlPiece ("|" :: Text)
instance FromJSON Location
-- | The base URL for the Google Maps APIs.
googleMapsApis :: BaseUrl
googleMapsApis = BaseUrl Https "maps.googleapis.com" 443 "/maps/api"