{-# LANGUAGE CPP #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UnliftedFFITypes #-}
module System.AbstractFilePath.Internal where
import {-# SOURCE #-} System.AbstractFilePath
( isValid )
import System.AbstractFilePath.Types
import System.OsString.Internal
import qualified System.OsString.Internal as OS
import System.OsString.Internal.Types
import Control.Monad.Catch
( MonadThrow )
import Data.ByteString
( ByteString )
import Language.Haskell.TH
import Language.Haskell.TH.Quote
( QuasiQuoter (..) )
import Language.Haskell.TH.Syntax
( Lift (..), lift )
import System.IO
( TextEncoding )
#ifndef WINDOWS
import System.AbstractFilePath.Data.ByteString.Short.Decode
(
UnicodeException (..)
)
#endif
toAbstractFilePath :: String -> AbstractFilePath
toAbstractFilePath :: String -> AbstractFilePath
toAbstractFilePath = String -> AbstractFilePath
toOsString
toAbstractFilePathIO :: String -> IO AbstractFilePath
toAbstractFilePathIO :: String -> IO AbstractFilePath
toAbstractFilePathIO = String -> IO AbstractFilePath
toOsStringIO
fromAbstractFilePath :: MonadThrow m => AbstractFilePath -> m String
fromAbstractFilePath :: AbstractFilePath -> m String
fromAbstractFilePath = AbstractFilePath -> m String
forall (m :: * -> *). MonadThrow m => AbstractFilePath -> m String
fromOsString
fromAbstractFilePathEnc :: AbstractFilePath -> TextEncoding -> Either UnicodeException String
fromAbstractFilePathEnc :: AbstractFilePath -> TextEncoding -> Either UnicodeException String
fromAbstractFilePathEnc = AbstractFilePath -> TextEncoding -> Either UnicodeException String
fromOsStringEnc
fromAbstractFilePathIO :: AbstractFilePath -> IO String
fromAbstractFilePathIO :: AbstractFilePath -> IO String
fromAbstractFilePathIO = AbstractFilePath -> IO String
fromOsStringIO
bsToAFP :: MonadThrow m
=> ByteString
-> m AbstractFilePath
bsToAFP :: ByteString -> m AbstractFilePath
bsToAFP = ByteString -> m AbstractFilePath
forall (m :: * -> *).
MonadThrow m =>
ByteString -> m AbstractFilePath
OS.bsToOsString
mkAbstractFilePath :: ByteString -> Q Exp
mkAbstractFilePath :: ByteString -> Q Exp
mkAbstractFilePath ByteString
bs =
case ByteString -> Maybe AbstractFilePath
forall (m :: * -> *).
MonadThrow m =>
ByteString -> m AbstractFilePath
bsToAFP ByteString
bs of
Just AbstractFilePath
afp' ->
if AbstractFilePath -> Bool
isValid AbstractFilePath
afp'
then AbstractFilePath -> Q Exp
forall t. Lift t => t -> Q Exp
lift AbstractFilePath
afp'
else String -> Q Exp
forall a. HasCallStack => String -> a
error String
"invalid filepath"
Maybe AbstractFilePath
Nothing -> String -> Q Exp
forall a. HasCallStack => String -> a
error String
"invalid encoding"
afp :: QuasiQuoter
afp :: QuasiQuoter
afp = (ByteString -> Q Exp) -> QuasiQuoter
qq ByteString -> Q Exp
mkAbstractFilePath
unpackAFP :: AbstractFilePath -> [OsChar]
unpackAFP :: AbstractFilePath -> [OsChar]
unpackAFP = AbstractFilePath -> [OsChar]
unpackOsString
packAFP :: [OsChar] -> AbstractFilePath
packAFP :: [OsChar] -> AbstractFilePath
packAFP = [OsChar] -> AbstractFilePath
packOsString