{-# LANGUAGE FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module URI.ByteString.Extension where

import Data.ByteString (ByteString)
import Data.String (IsString (..))
import Data.Text (Text)
import Data.Text.Encoding (decodeUtf8, encodeUtf8)
import Lens.Micro

import qualified Data.ByteString.Char8 as C8

import URI.ByteString

instance IsString Scheme where
  fromString :: String -> Scheme
fromString = ByteString -> Scheme
Scheme forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsString a => String -> a
fromString

instance IsString Host where
  fromString :: String -> Host
fromString = ByteString -> Host
Host forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsString a => String -> a
fromString

instance IsString (URIRef Absolute) where
  fromString :: String -> URIRef Absolute
fromString =
    forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a. HasCallStack => String -> a
error forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> String
show) forall a. a -> a
id forall b c a. (b -> c) -> (a -> b) -> a -> c
. URIParserOptions
-> ByteString -> Either URIParseError (URIRef Absolute)
parseURI URIParserOptions
strictURIParserOptions forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
C8.pack

instance IsString (URIRef Relative) where
  fromString :: String -> URIRef Relative
fromString =
    forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a. HasCallStack => String -> a
error forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> String
show) forall a. a -> a
id forall b c a. (b -> c) -> (a -> b) -> a -> c
. URIParserOptions
-> ByteString -> Either URIParseError (URIRef Relative)
parseRelativeRef URIParserOptions
strictURIParserOptions forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
C8.pack

fromText :: Text -> Maybe URI
fromText :: Text -> Maybe (URIRef Absolute)
fromText =
  forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a b. a -> b -> a
const forall a. Maybe a
Nothing) forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. URIParserOptions
-> ByteString -> Either URIParseError (URIRef Absolute)
parseURI URIParserOptions
strictURIParserOptions forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
encodeUtf8

unsafeFromText :: Text -> URI
unsafeFromText :: Text -> URIRef Absolute
unsafeFromText =
  forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a. HasCallStack => String -> a
error forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> String
show) forall a. a -> a
id forall b c a. (b -> c) -> (a -> b) -> a -> c
. URIParserOptions
-> ByteString -> Either URIParseError (URIRef Absolute)
parseURI URIParserOptions
strictURIParserOptions forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
encodeUtf8

toText :: URI -> Text
toText :: URIRef Absolute -> Text
toText = ByteString -> Text
decodeUtf8 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. URIRef a -> ByteString
serializeURIRef'

fromRelative :: Scheme -> Host -> RelativeRef -> URI
fromRelative :: Scheme -> Host -> URIRef Relative -> URIRef Absolute
fromRelative Scheme
s Host
h = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a. URIRef a -> Host -> URIRef a
withHost Host
h forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Scheme -> URIRef a -> URIRef Absolute
toAbsolute Scheme
s

withHost :: URIRef a -> Host -> URIRef a
withHost :: forall a. URIRef a -> Host -> URIRef a
withHost URIRef a
u Host
h =
  URIRef a
u
    forall a b. a -> (a -> b) -> b
& forall a. Lens' (URIRef a) (Maybe Authority)
authorityL
      forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall b a. b -> (a -> b) -> Maybe a -> b
maybe
        (forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Maybe UserInfo -> Host -> Maybe Port -> Authority
Authority forall a. Maybe a
Nothing Host
h forall a. Maybe a
Nothing)
        (\Authority
a -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Authority
a forall a b. a -> (a -> b) -> b
& Lens' Authority Host
authorityHostL forall s t a b. ASetter s t a b -> b -> s -> t
.~ Host
h)

withPath :: URIRef a -> ByteString -> URIRef a
withPath :: forall a. URIRef a -> ByteString -> URIRef a
withPath URIRef a
u ByteString
p = URIRef a
u forall a b. a -> (a -> b) -> b
& forall a. Lens' (URIRef a) ByteString
pathL forall s t a b. ASetter s t a b -> b -> s -> t
.~ ByteString
p

withQuery :: URIRef a -> [(ByteString, ByteString)] -> URIRef a
withQuery :: forall a. URIRef a -> [(ByteString, ByteString)] -> URIRef a
withQuery URIRef a
u [(ByteString, ByteString)]
q = URIRef a
u forall a b. a -> (a -> b) -> b
& (forall a. Lens' (URIRef a) Query
queryL forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lens' Query [(ByteString, ByteString)]
queryPairsL) forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (forall a. [a] -> [a] -> [a]
++ [(ByteString, ByteString)]
q)