packages feed

hbro-1.3.0.0: library/Network/URI/Extended.hs

{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Monadic version of 'Network.URI'.
module Network.URI.Extended
    ( module X
    , parseURIReferenceM
    , parseURIM
    ) where

-- {{{ Imports
import           Hbro.Error
import           Hbro.Prelude

import           Data.Aeson

import           Network.URI  as X
-- }}}

instance FromJSON URI where
    parseJSON (String t) = maybe mzero return . parseURIReference $ unpack t
    parseJSON _ = mzero

instance ToJSON URI where
    toJSON = String . tshow

-- | Error message
invalidURI :: Text -> Text
invalidURI uri = "Invalid URI: " ++ uri

-- | Monadic version of 'parseURIReference'
parseURIReferenceM :: (MonadError Text m) => Text -> m URI
parseURIReferenceM uri = parseURIReference (unpack uri) `failWith` invalidURI uri

-- | Monadic version of 'parseURI'
parseURIM :: (MonadError Text m) => Text -> m URI
parseURIM uri = parseURI (unpack uri) `failWith` invalidURI uri