{-# LANGUAGE CPP #-}
module PathSize.Utils
(
MonadPosixC,
hidden,
getFileStatus,
unzipResultSeq,
)
where
#if !MIN_VERSION_base(4, 20, 0)
import Data.Foldable (foldl')
#endif
import Data.Sequence (Seq (Empty, (:<|)))
import Data.Sequence.NonEmpty (NESeq ((:<||)))
import Effects.FileSystem.OsPath (OsPath)
import PathSize.Data.PathSizeResult
( PathSizeResult
( PathSizeFailure,
PathSizePartial,
PathSizeSuccess
),
)
import PathSize.Data.PathTree (PathTree)
import PathSize.Exception (PathE)
import System.PosixCompat.Files (FileStatus)
#if POSIX
import Effects.Exception (HasCallStack)
import Effects.System.Posix (MonadPosix)
import Effects.System.Posix qualified as Posix
import System.OsString.Internal.Types
( OsString (getOsString),
PosixString(getPosixString),
)
#if OS_STRING
import System.OsString.Data.ByteString.Short qualified as Short
#else
import System.OsPath.Data.ByteString.Short qualified as Short
#endif
#else
import Effects.Exception (HasCallStack, MonadThrow)
import Effects.FileSystem.OsPath qualified as FS.OsPath
import Effects.System.PosixCompat (MonadPosixCompat)
import Effects.System.PosixCompat qualified as PosixCompat
#endif
unzipResultSeq :: Seq (PathSizeResult PathTree) -> (Seq PathE, Seq PathTree)
unzipResultSeq :: Seq (PathSizeResult PathTree) -> (Seq PathE, Seq PathTree)
unzipResultSeq = ((Seq PathE, Seq PathTree)
-> PathSizeResult PathTree -> (Seq PathE, Seq PathTree))
-> (Seq PathE, Seq PathTree)
-> Seq (PathSizeResult PathTree)
-> (Seq PathE, Seq PathTree)
forall b a. (b -> a -> b) -> b -> Seq a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (Seq PathE, Seq PathTree)
-> PathSizeResult PathTree -> (Seq PathE, Seq PathTree)
forall {a}.
(Seq PathE, Seq a) -> PathSizeResult a -> (Seq PathE, Seq a)
f (Seq PathE
forall a. Seq a
Empty, Seq PathTree
forall a. Seq a
Empty)
where
f :: (Seq PathE, Seq a) -> PathSizeResult a -> (Seq PathE, Seq a)
f (Seq PathE
errs, Seq a
trees) = \case
PathSizeSuccess a
tree -> (Seq PathE
errs, a
tree a -> Seq a -> Seq a
forall a. a -> Seq a -> Seq a
:<| Seq a
trees)
PathSizePartial (PathE
e :<|| Seq PathE
es) a
tree -> (PathE
e PathE -> Seq PathE -> Seq PathE
forall a. a -> Seq a -> Seq a
:<| Seq PathE
es Seq PathE -> Seq PathE -> Seq PathE
forall a. Semigroup a => a -> a -> a
<> Seq PathE
errs, a
tree a -> Seq a -> Seq a
forall a. a -> Seq a -> Seq a
:<| Seq a
trees)
PathSizeFailure (PathE
e :<|| Seq PathE
es) -> (PathE
e PathE -> Seq PathE -> Seq PathE
forall a. a -> Seq a -> Seq a
:<| Seq PathE
es Seq PathE -> Seq PathE -> Seq PathE
forall a. Semigroup a => a -> a -> a
<> Seq PathE
errs, Seq a
trees)
hidden :: OsPath -> Bool
#if POSIX
hidden :: OsPath -> Bool
hidden OsPath
p = case ShortByteString -> Maybe (Word8, Word8, ShortByteString)
Short.uncons2 ShortByteString
sbs of
Maybe (Word8, Word8, ShortByteString)
Nothing -> Bool
False
Just (Word8
46, Word8
47, ShortByteString
_) -> Bool
False
Just (Word8
46, Word8
_, ShortByteString
_) -> Bool
True
Just (Word8, Word8, ShortByteString)
_ -> Bool
False
where
sbs :: ShortByteString
sbs = OsPath
p.getOsString.getPosixString
#else
hidden = const False
#endif
type MonadPosixC m =
#if POSIX
MonadPosix m
#else
MonadPosixCompat m
#endif
#if POSIX
getFileStatus ::
forall m.
( HasCallStack,
MonadPosixC m
) =>
OsPath ->
m FileStatus
getFileStatus :: forall (m :: * -> *).
(HasCallStack, MonadPosixC m) =>
OsPath -> m FileStatus
getFileStatus OsPath
path =
PlatformString -> m FileStatus
forall (m :: * -> *).
(MonadPosix m, HasCallStack) =>
PlatformString -> m FileStatus
Posix.getSymbolicLinkStatus OsPath
path.getOsString
#else
getFileStatus ::
forall m.
( HasCallStack,
MonadPosixC m,
MonadThrow m
) =>
OsPath ->
m FileStatus
getFileStatus path = do
fp <- FS.OsPath.decodeThrowM path
PosixCompat.getSymbolicLinkStatus fp
#endif