module Prolude.Uri
  ( -- $conversions
    -- * Type alias
    Uri
    -- * Functions
  , stringToUri
  , textToUri
  , uriToString
  , uriToText
  )
where

import qualified Data.Either as Either
import qualified Data.String as String
import qualified Data.Text as Text
import qualified Network.URI as URI

import qualified Prolude.Core as Core
import qualified Prolude.Text as Text

{- $conversions
+---------+-------------+-------------+
| From/To | Uri         | String      |
+---------+-------------+-------------+
| Uri     | -           | uriToString |
+---------+-------------+-------------+
| String  | stringToUri | -           |
+---------+-------------+-------------+

+---------+-----------+-----------+
| From/To | Uri       | Text      |
+---------+-----------+-----------+
| Uri     | -         | uriToText |
+---------+-----------+-----------+
| Text    | textToUri | -         |
+---------+-----------+-----------+
-}

type Uri = URI.URI

stringToUri :: String.String -> Either.Either String.String URI.URI
stringToUri :: String -> Either String URI
stringToUri String
string = case String -> Maybe URI
URI.parseURI String
string of
  Maybe URI
Nothing -> String -> Either String URI
forall a b. a -> Either a b
Left (String -> Either String URI) -> String -> Either String URI
forall a b. (a -> b) -> a -> b
$ String
"invalid URI: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String -> String
forall a. Show a => a -> String
show String
string
  Just URI
uri -> URI -> Either String URI
forall a b. b -> Either a b
Right URI
uri

textToUri :: Text.Text -> Either.Either String.String URI.URI
textToUri :: Text -> Either String URI
textToUri = String -> Either String URI
stringToUri (String -> Either String URI)
-> (Text -> String) -> Text -> Either String URI
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.textToString

uriToString :: URI.URI -> String.String
uriToString :: URI -> String
uriToString URI
uri = (String -> String) -> URI -> String -> String
URI.uriToString String -> String
forall a. a -> a
Core.identity URI
uri String
""

uriToText :: URI.URI -> Text.Text
uriToText :: URI -> Text
uriToText = String -> Text
Text.stringToText (String -> Text) -> (URI -> String) -> URI -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. URI -> String
uriToString