50 lines
1.5 KiB
Haskell
50 lines
1.5 KiB
Haskell
|
{-# LANGUAGE CPP #-}
|
||
|
{-# LANGUAGE OverloadedStrings #-}
|
||
|
|
||
|
{-|
|
||
|
Module : GHCup.Utils.URI
|
||
|
Description : GHCup domain specific URI utilities
|
||
|
Copyright : (c) Julian Ospald, 2024
|
||
|
License : LGPL-3.0
|
||
|
Maintainer : hasufell@hasufell.de
|
||
|
Stability : experimental
|
||
|
Portability : portable
|
||
|
|
||
|
This module contains GHCup helpers specific to
|
||
|
URI handling.
|
||
|
-}
|
||
|
module GHCup.Utils.URI where
|
||
|
|
||
|
import Data.ByteString
|
||
|
import URI.ByteString hiding (parseURI)
|
||
|
import System.URI.File
|
||
|
|
||
|
import qualified URI.ByteString as URI
|
||
|
|
||
|
|
||
|
-----------
|
||
|
--[ URI ]--
|
||
|
-----------
|
||
|
|
||
|
|
||
|
parseURI :: ByteString -> Either URIParseError (URIRef Absolute)
|
||
|
parseURI bs = case parseFile bs of
|
||
|
Left _ -> case URI.parseURI strictURIParserOptions bs of
|
||
|
Right (URI { uriScheme = (Scheme "file") }) ->
|
||
|
#if defined(IS_WINDOWS)
|
||
|
Left (OtherError "Invalid file URI. File URIs must be absolute (start with a drive letter or UNC path) and not contain backslashes.")
|
||
|
#else
|
||
|
Left (OtherError "Invalid file URI. File URIs must be absolute.")
|
||
|
#endif
|
||
|
o -> o
|
||
|
Right (FileURI (Just _) _) -> Left $ OtherError "File URIs with auth part are not supported!"
|
||
|
Right (FileURI _ fp) -> Right $ URI (Scheme "file") Nothing fp (Query []) Nothing
|
||
|
where
|
||
|
parseFile
|
||
|
#if defined(IS_WINDOWS)
|
||
|
= parseFileURI ExtendedWindows
|
||
|
#else
|
||
|
= parseFileURI ExtendedPosix
|
||
|
#endif
|
||
|
|