{-# 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