module Network.Protocol.Uri.Data where
import Prelude hiding ((.), id)
import Control.Category
import Data.Record.Label
import Data.Maybe
import Network.Protocol.Uri.Encode
type Scheme = String
type RegName = String
type Port = Int
type Query = String
type Fragment = String
type Hash = String
type UserInfo = String
type PathSegment = String
data IPv4 = IPv4 Int Int Int Int
deriving (Eq, Ord)
data Domain = Domain { __parts :: [String] }
deriving (Eq, Ord)
data Host =
Hostname { __domain :: Domain }
| RegName { __regname :: RegName }
| IP { __ipv4 :: IPv4 }
deriving (Eq, Ord)
data Authority = Authority
{ __userinfo :: UserInfo
, __host :: Host
, __port :: Maybe Port
}
deriving (Eq, Ord)
data Path = Path { __segments :: [PathSegment] }
deriving (Eq, Ord)
data Uri = Uri
{ _relative :: Bool
, _scheme :: Scheme
, _authority :: Authority
, __path :: Path
, __query :: Query
, __fragment :: Fragment
}
deriving (Eq, Ord)
$(mkLabels [''Domain, ''Path, ''Host, ''Authority, ''Uri])
_parts :: Domain :-> [String]
_domain :: Host :-> Domain
_ipv4 :: Host :-> IPv4
_regname :: Host :-> String
_host :: Authority :-> Host
_port :: Authority :-> Maybe Port
_userinfo :: Authority :-> UserInfo
_segments :: Path :-> [PathSegment]
_path :: Uri :-> Path
_query :: Uri :-> Query
authority :: Uri :-> Authority
domain :: Uri :-> Maybe Domain
domain = (f <-> Hostname . fromJust) `iso` (_host . authority)
where
f (Hostname d) = Just d
f _ = Nothing
regname :: Uri :-> Maybe RegName
regname = (f <-> RegName . fromJust) `iso` (_host . authority)
where
f (RegName r) = Just r
f _ = Nothing
ipv4 :: Uri :-> Maybe IPv4
ipv4 = (f <-> IP . fromJust) `iso` (_host . authority)
where
f (IP i) = Just i
f _ = Nothing
_fragment :: Uri :-> Fragment
port :: Uri :-> Maybe Port
port = _port . authority
query :: Uri :-> Query
query = encoded `iso` _query
fragment :: Uri :-> Fragment
fragment = encoded `iso` _fragment
relative :: Uri :-> Bool
scheme :: Uri :-> Scheme
segments :: Uri :-> [PathSegment]
segments = _segments . _path
userinfo :: Uri :-> String
userinfo = _userinfo . authority
mkUri :: Uri
mkUri = Uri False mkScheme mkAuthority mkPath mkQuery mkFragment
mkScheme :: Scheme
mkScheme = ""
mkPath :: Path
mkPath = Path []
mkAuthority :: Authority
mkAuthority = Authority "" mkHost mkPort
mkQuery :: Query
mkQuery = ""
mkFragment :: Fragment
mkFragment = ""
mkUserinfo :: UserInfo
mkUserinfo = ""
mkHost :: Host
mkHost = Hostname (Domain [])
mkPort :: Maybe Port
mkPort = Nothing