-- | This module provides orphan instances for 'ToHttpApiData'
--   and 'FromHttpApiData' for data types from the @ip@ package.

module Web.HttpApiData.Net () where

import Data.Monoid
import Data.Text (Text)
import Net.Types (IPv4,Mac)
import Web.HttpApiData (ToHttpApiData(..),FromHttpApiData(..))

import qualified Data.Text as Text
import qualified Net.IPv4 as IPv4
import qualified Net.Mac as Mac

instance ToHttpApiData Mac where
  toUrlPiece   = Mac.encode
  toHeader     = Mac.encodeUtf8
  toQueryParam = Mac.encode

instance FromHttpApiData Mac where
  parseUrlPiece   = describeError mac . Mac.decode
  parseQueryParam = describeError mac . Mac.decode
  parseHeader     = describeError mac . Mac.decodeUtf8

instance ToHttpApiData IPv4 where
  toUrlPiece   = IPv4.encode
  toHeader     = IPv4.encodeUtf8
  toQueryParam = IPv4.encode

instance FromHttpApiData IPv4 where
  parseUrlPiece   = describeError ipv4 . IPv4.decode
  parseQueryParam = describeError ipv4 . IPv4.decode
  parseHeader     = describeError ipv4 . IPv4.decodeUtf8

mac,ipv4 :: Text
mac = Text.pack "MAC Address"
ipv4 = Text.pack "IPv4 Address"

describeError :: Text -> Maybe a -> Either Text a
describeError name x = case x of
  Nothing -> Left (Text.pack "could not parse " <> name)
  Just a  -> Right a