module OpenDAL
(
OperatorConfig (..),
Operator,
Lister,
OpenDALError (..),
ErrorCode (..),
EntryMode (..),
Metadata (..),
OperatorT (..),
MonadOperation (..),
runOp,
newOperator,
nextLister,
readOpRaw,
writeOpRaw,
isExistOpRaw,
createDirOpRaw,
copyOpRaw,
renameOpRaw,
deleteOpRaw,
statOpRaw,
listOpRaw,
scanOpRaw,
)
where
import Colog (LogAction, Message, Msg (Msg), (<&))
import Control.Monad.Except (ExceptT, MonadError, MonadTrans, runExceptT, throwError)
import Control.Monad.Reader (MonadIO, MonadReader, ReaderT, ask, liftIO, runReaderT)
import Control.Monad.Trans (MonadTrans (lift))
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HashMap
import Data.String (IsString (fromString))
import Data.Text (pack)
import Data.Time (UTCTime, parseTimeM, zonedTimeToUTC)
import Data.Time.Format (defaultTimeLocale)
import Foreign
import Foreign.C.String
import GHC.Stack (emptyCallStack)
import OpenDAL.FFI
data OperatorConfig = OperatorConfig
{
OperatorConfig -> String
ocScheme :: String,
OperatorConfig -> HashMap String String
ocConfig :: HashMap String String,
OperatorConfig -> Maybe (LogAction IO Message)
ocLogAction :: Maybe (LogAction IO Message)
}
instance IsString OperatorConfig where
fromString :: String -> OperatorConfig
fromString String
s = String
-> HashMap String String
-> Maybe (LogAction IO Message)
-> OperatorConfig
OperatorConfig String
s forall k v. HashMap k v
HashMap.empty forall a. Maybe a
Nothing
newtype Operator = Operator (ForeignPtr RawOperator)
newtype Lister = Lister (ForeignPtr RawLister)
data ErrorCode
=
FFIError
|
Unexpected
|
Unsupported
|
ConfigInvalid
|
NotFound
|
PermissionDenied
|
IsADirectory
|
NotADirectory
|
AlreadyExists
|
RateLimited
|
IsSameFile
deriving (ErrorCode -> ErrorCode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ErrorCode -> ErrorCode -> Bool
$c/= :: ErrorCode -> ErrorCode -> Bool
== :: ErrorCode -> ErrorCode -> Bool
$c== :: ErrorCode -> ErrorCode -> Bool
Eq, Int -> ErrorCode -> ShowS
[ErrorCode] -> ShowS
ErrorCode -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ErrorCode] -> ShowS
$cshowList :: [ErrorCode] -> ShowS
show :: ErrorCode -> String
$cshow :: ErrorCode -> String
showsPrec :: Int -> ErrorCode -> ShowS
$cshowsPrec :: Int -> ErrorCode -> ShowS
Show)
data OpenDALError = OpenDALError
{
OpenDALError -> ErrorCode
errorCode :: ErrorCode,
OpenDALError -> String
message :: String
}
deriving (OpenDALError -> OpenDALError -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OpenDALError -> OpenDALError -> Bool
$c/= :: OpenDALError -> OpenDALError -> Bool
== :: OpenDALError -> OpenDALError -> Bool
$c== :: OpenDALError -> OpenDALError -> Bool
Eq, Int -> OpenDALError -> ShowS
[OpenDALError] -> ShowS
OpenDALError -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OpenDALError] -> ShowS
$cshowList :: [OpenDALError] -> ShowS
show :: OpenDALError -> String
$cshow :: OpenDALError -> String
showsPrec :: Int -> OpenDALError -> ShowS
$cshowsPrec :: Int -> OpenDALError -> ShowS
Show)
data EntryMode = File | Dir | Unknown deriving (EntryMode -> EntryMode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EntryMode -> EntryMode -> Bool
$c/= :: EntryMode -> EntryMode -> Bool
== :: EntryMode -> EntryMode -> Bool
$c== :: EntryMode -> EntryMode -> Bool
Eq, Int -> EntryMode -> ShowS
[EntryMode] -> ShowS
EntryMode -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EntryMode] -> ShowS
$cshowList :: [EntryMode] -> ShowS
show :: EntryMode -> String
$cshow :: EntryMode -> String
showsPrec :: Int -> EntryMode -> ShowS
$cshowsPrec :: Int -> EntryMode -> ShowS
Show)
data Metadata = Metadata
{
Metadata -> EntryMode
mMode :: EntryMode,
Metadata -> Maybe String
mCacheControl :: Maybe String,
Metadata -> Maybe String
mContentDisposition :: Maybe String,
Metadata -> Integer
mContentLength :: Integer,
Metadata -> Maybe String
mContentMD5 :: Maybe String,
Metadata -> Maybe String
mContentType :: Maybe String,
Metadata -> Maybe String
mETag :: Maybe String,
Metadata -> Maybe UTCTime
mLastModified :: Maybe UTCTime
}
deriving (Metadata -> Metadata -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Metadata -> Metadata -> Bool
$c/= :: Metadata -> Metadata -> Bool
== :: Metadata -> Metadata -> Bool
$c== :: Metadata -> Metadata -> Bool
Eq, Int -> Metadata -> ShowS
[Metadata] -> ShowS
Metadata -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Metadata] -> ShowS
$cshowList :: [Metadata] -> ShowS
show :: Metadata -> String
$cshow :: Metadata -> String
showsPrec :: Int -> Metadata -> ShowS
$cshowsPrec :: Int -> Metadata -> ShowS
Show)
newtype OperatorT m a = OperatorT
{forall (m :: * -> *) a.
OperatorT m a -> ReaderT Operator (ExceptT OpenDALError m) a
runOperatorT :: ReaderT Operator (ExceptT OpenDALError m) a}
deriving newtype (forall a b. a -> OperatorT m b -> OperatorT m a
forall a b. (a -> b) -> OperatorT m a -> OperatorT m b
forall (m :: * -> *) a b.
Functor m =>
a -> OperatorT m b -> OperatorT m a
forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> OperatorT m a -> OperatorT m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> OperatorT m b -> OperatorT m a
$c<$ :: forall (m :: * -> *) a b.
Functor m =>
a -> OperatorT m b -> OperatorT m a
fmap :: forall a b. (a -> b) -> OperatorT m a -> OperatorT m b
$cfmap :: forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> OperatorT m a -> OperatorT m b
Functor, forall a. a -> OperatorT m a
forall a b. OperatorT m a -> OperatorT m b -> OperatorT m a
forall a b. OperatorT m a -> OperatorT m b -> OperatorT m b
forall a b. OperatorT m (a -> b) -> OperatorT m a -> OperatorT m b
forall a b c.
(a -> b -> c) -> OperatorT m a -> OperatorT m b -> OperatorT m c
forall {m :: * -> *}. Monad m => Functor (OperatorT m)
forall (m :: * -> *) a. Monad m => a -> OperatorT m a
forall (m :: * -> *) a b.
Monad m =>
OperatorT m a -> OperatorT m b -> OperatorT m a
forall (m :: * -> *) a b.
Monad m =>
OperatorT m a -> OperatorT m b -> OperatorT m b
forall (m :: * -> *) a b.
Monad m =>
OperatorT m (a -> b) -> OperatorT m a -> OperatorT m b
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> OperatorT m a -> OperatorT m b -> OperatorT m c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. OperatorT m a -> OperatorT m b -> OperatorT m a
$c<* :: forall (m :: * -> *) a b.
Monad m =>
OperatorT m a -> OperatorT m b -> OperatorT m a
*> :: forall a b. OperatorT m a -> OperatorT m b -> OperatorT m b
$c*> :: forall (m :: * -> *) a b.
Monad m =>
OperatorT m a -> OperatorT m b -> OperatorT m b
liftA2 :: forall a b c.
(a -> b -> c) -> OperatorT m a -> OperatorT m b -> OperatorT m c
$cliftA2 :: forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> OperatorT m a -> OperatorT m b -> OperatorT m c
<*> :: forall a b. OperatorT m (a -> b) -> OperatorT m a -> OperatorT m b
$c<*> :: forall (m :: * -> *) a b.
Monad m =>
OperatorT m (a -> b) -> OperatorT m a -> OperatorT m b
pure :: forall a. a -> OperatorT m a
$cpure :: forall (m :: * -> *) a. Monad m => a -> OperatorT m a
Applicative, forall a. a -> OperatorT m a
forall a b. OperatorT m a -> OperatorT m b -> OperatorT m b
forall a b. OperatorT m a -> (a -> OperatorT m b) -> OperatorT m b
forall (m :: * -> *). Monad m => Applicative (OperatorT m)
forall (m :: * -> *) a. Monad m => a -> OperatorT m a
forall (m :: * -> *) a b.
Monad m =>
OperatorT m a -> OperatorT m b -> OperatorT m b
forall (m :: * -> *) a b.
Monad m =>
OperatorT m a -> (a -> OperatorT m b) -> OperatorT m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> OperatorT m a
$creturn :: forall (m :: * -> *) a. Monad m => a -> OperatorT m a
>> :: forall a b. OperatorT m a -> OperatorT m b -> OperatorT m b
$c>> :: forall (m :: * -> *) a b.
Monad m =>
OperatorT m a -> OperatorT m b -> OperatorT m b
>>= :: forall a b. OperatorT m a -> (a -> OperatorT m b) -> OperatorT m b
$c>>= :: forall (m :: * -> *) a b.
Monad m =>
OperatorT m a -> (a -> OperatorT m b) -> OperatorT m b
Monad, forall a. IO a -> OperatorT m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
forall {m :: * -> *}. MonadIO m => Monad (OperatorT m)
forall (m :: * -> *) a. MonadIO m => IO a -> OperatorT m a
liftIO :: forall a. IO a -> OperatorT m a
$cliftIO :: forall (m :: * -> *) a. MonadIO m => IO a -> OperatorT m a
MonadIO, MonadReader Operator, MonadError OpenDALError)
instance MonadTrans OperatorT where
lift :: forall (m :: * -> *) a. Monad m => m a -> OperatorT m a
lift = forall (m :: * -> *) a.
ReaderT Operator (ExceptT OpenDALError m) a -> OperatorT m a
OperatorT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift
class (Monad m) => MonadOperation m where
readOp :: String -> m ByteString
writeOp :: String -> ByteString -> m ()
isExistOp :: String -> m Bool
createDirOp :: String -> m ()
copyOp :: String -> String -> m ()
renameOp :: String -> String -> m ()
deleteOp :: String -> m ()
statOp :: String -> m Metadata
listOp :: String -> m Lister
scanOp :: String -> m Lister
instance (MonadIO m) => MonadOperation (OperatorT m) where
readOp :: String -> OperatorT m ByteString
readOp String
path = do
Operator
op <- forall r (m :: * -> *). MonadReader r m => m r
ask
Either OpenDALError ByteString
result <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Operator -> String -> IO (Either OpenDALError ByteString)
readOpRaw Operator
op String
path
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall (m :: * -> *) a. Monad m => a -> m a
return Either OpenDALError ByteString
result
writeOp :: String -> ByteString -> OperatorT m ()
writeOp String
path ByteString
byte = do
Operator
op <- forall r (m :: * -> *). MonadReader r m => m r
ask
Either OpenDALError ()
result <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Operator -> String -> ByteString -> IO (Either OpenDALError ())
writeOpRaw Operator
op String
path ByteString
byte
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall (m :: * -> *) a. Monad m => a -> m a
return Either OpenDALError ()
result
isExistOp :: String -> OperatorT m Bool
isExistOp String
path = do
Operator
op <- forall r (m :: * -> *). MonadReader r m => m r
ask
Either OpenDALError Bool
result <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Operator -> String -> IO (Either OpenDALError Bool)
isExistOpRaw Operator
op String
path
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall (m :: * -> *) a. Monad m => a -> m a
return Either OpenDALError Bool
result
createDirOp :: String -> OperatorT m ()
createDirOp String
path = do
Operator
op <- forall r (m :: * -> *). MonadReader r m => m r
ask
Either OpenDALError ()
result <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Operator -> String -> IO (Either OpenDALError ())
createDirOpRaw Operator
op String
path
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall (m :: * -> *) a. Monad m => a -> m a
return Either OpenDALError ()
result
copyOp :: String -> String -> OperatorT m ()
copyOp String
src String
dst = do
Operator
op <- forall r (m :: * -> *). MonadReader r m => m r
ask
Either OpenDALError ()
result <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Operator -> String -> String -> IO (Either OpenDALError ())
copyOpRaw Operator
op String
src String
dst
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall (m :: * -> *) a. Monad m => a -> m a
return Either OpenDALError ()
result
renameOp :: String -> String -> OperatorT m ()
renameOp String
src String
dst = do
Operator
op <- forall r (m :: * -> *). MonadReader r m => m r
ask
Either OpenDALError ()
result <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Operator -> String -> String -> IO (Either OpenDALError ())
renameOpRaw Operator
op String
src String
dst
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall (m :: * -> *) a. Monad m => a -> m a
return Either OpenDALError ()
result
deleteOp :: String -> OperatorT m ()
deleteOp String
path = do
Operator
op <- forall r (m :: * -> *). MonadReader r m => m r
ask
Either OpenDALError ()
result <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Operator -> String -> IO (Either OpenDALError ())
deleteOpRaw Operator
op String
path
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall (m :: * -> *) a. Monad m => a -> m a
return Either OpenDALError ()
result
statOp :: String -> OperatorT m Metadata
statOp String
path = do
Operator
op <- forall r (m :: * -> *). MonadReader r m => m r
ask
Either OpenDALError Metadata
result <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Operator -> String -> IO (Either OpenDALError Metadata)
statOpRaw Operator
op String
path
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall (m :: * -> *) a. Monad m => a -> m a
return Either OpenDALError Metadata
result
listOp :: String -> OperatorT m Lister
listOp String
path = do
Operator
op <- forall r (m :: * -> *). MonadReader r m => m r
ask
Either OpenDALError Lister
result <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Operator -> String -> IO (Either OpenDALError Lister)
listOpRaw Operator
op String
path
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall (m :: * -> *) a. Monad m => a -> m a
return Either OpenDALError Lister
result
scanOp :: String -> OperatorT m Lister
scanOp String
path = do
Operator
op <- forall r (m :: * -> *). MonadReader r m => m r
ask
Either OpenDALError Lister
result <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ Operator -> String -> IO (Either OpenDALError Lister)
scanOpRaw Operator
op String
path
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall (m :: * -> *) a. Monad m => a -> m a
return Either OpenDALError Lister
result
byteSliceToByteString :: ByteSlice -> IO ByteString
byteSliceToByteString :: ByteSlice -> IO ByteString
byteSliceToByteString (ByteSlice CString
bsDataPtr CSize
len) = CStringLen -> IO ByteString
BS.packCStringLen (CString
bsDataPtr, forall a b. (Integral a, Num b) => a -> b
fromIntegral CSize
len)
parseErrorCode :: Int -> ErrorCode
parseErrorCode :: Int -> ErrorCode
parseErrorCode Int
1 = ErrorCode
FFIError
parseErrorCode Int
2 = ErrorCode
Unexpected
parseErrorCode Int
3 = ErrorCode
Unsupported
parseErrorCode Int
4 = ErrorCode
ConfigInvalid
parseErrorCode Int
5 = ErrorCode
NotFound
parseErrorCode Int
6 = ErrorCode
PermissionDenied
parseErrorCode Int
7 = ErrorCode
IsADirectory
parseErrorCode Int
8 = ErrorCode
NotADirectory
parseErrorCode Int
9 = ErrorCode
AlreadyExists
parseErrorCode Int
10 = ErrorCode
RateLimited
parseErrorCode Int
11 = ErrorCode
IsSameFile
parseErrorCode Int
_ = ErrorCode
FFIError
parseEntryMode :: Int -> EntryMode
parseEntryMode :: Int -> EntryMode
parseEntryMode Int
0 = EntryMode
File
parseEntryMode Int
1 = EntryMode
Dir
parseEntryMode Int
_ = EntryMode
Unknown
parseCString :: CString -> IO (Maybe String)
parseCString :: CString -> IO (Maybe String)
parseCString CString
value | CString
value forall a. Eq a => a -> a -> Bool
== forall a. Ptr a
nullPtr = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
parseCString CString
value = do
String
value' <- CString -> IO String
peekCString CString
value
forall a. Ptr a -> IO ()
free CString
value
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just String
value'
parseTime :: String -> Maybe UTCTime
parseTime :: String -> Maybe UTCTime
parseTime String
time = ZonedTime -> UTCTime
zonedTimeToUTC forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) t.
(MonadFail m, ParseTime t) =>
Bool -> TimeLocale -> String -> String -> m t
parseTimeM Bool
True TimeLocale
defaultTimeLocale String
"%Y-%m-%dT%H:%M:%S%Q%z" String
time
parseFFIMetadata :: FFIMetadata -> IO Metadata
parseFFIMetadata :: FFIMetadata -> IO Metadata
parseFFIMetadata (FFIMetadata CUInt
mode CString
cacheControl CString
contentDisposition CULong
contentLength CString
contentMD5 CString
contentType CString
eTag CString
lastModified) = do
let mode' :: EntryMode
mode' = Int -> EntryMode
parseEntryMode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral CUInt
mode
Maybe String
cacheControl' <- CString -> IO (Maybe String)
parseCString CString
cacheControl
Maybe String
contentDisposition' <- CString -> IO (Maybe String)
parseCString CString
contentDisposition
let contentLength' :: Integer
contentLength' = forall a. Integral a => a -> Integer
toInteger CULong
contentLength
Maybe String
contentMD5' <- CString -> IO (Maybe String)
parseCString CString
contentMD5
Maybe String
contentType' <- CString -> IO (Maybe String)
parseCString CString
contentType
Maybe String
eTag' <- CString -> IO (Maybe String)
parseCString CString
eTag
Maybe UTCTime
lastModified' <- (forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> Maybe UTCTime
parseTime) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CString -> IO (Maybe String)
parseCString CString
lastModified
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$
Metadata
{ mMode :: EntryMode
mMode = EntryMode
mode',
mCacheControl :: Maybe String
mCacheControl = Maybe String
cacheControl',
mContentDisposition :: Maybe String
mContentDisposition = Maybe String
contentDisposition',
mContentLength :: Integer
mContentLength = Integer
contentLength',
mContentMD5 :: Maybe String
mContentMD5 = Maybe String
contentMD5',
mContentType :: Maybe String
mContentType = Maybe String
contentType',
mETag :: Maybe String
mETag = Maybe String
eTag',
mLastModified :: Maybe UTCTime
mLastModified = Maybe UTCTime
lastModified'
}
runOp :: Operator -> OperatorT m a -> m (Either OpenDALError a)
runOp :: forall (m :: * -> *) a.
Operator -> OperatorT m a -> m (Either OpenDALError a)
runOp Operator
op = forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b c. (a -> b -> c) -> b -> a -> c
flip forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT Operator
op forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a.
OperatorT m a -> ReaderT Operator (ExceptT OpenDALError m) a
runOperatorT
{-# INLINE runOp #-}
newOperator :: OperatorConfig -> IO (Either OpenDALError Operator)
newOperator :: OperatorConfig -> IO (Either OpenDALError Operator)
newOperator (OperatorConfig String
scheme HashMap String String
hashMap Maybe (LogAction IO Message)
maybeLogger) = do
let keysAndValues :: [(String, String)]
keysAndValues = forall k v. HashMap k v -> [(k, v)]
HashMap.toList HashMap String String
hashMap
forall a. String -> (CString -> IO a) -> IO a
withCString String
scheme forall a b. (a -> b) -> a -> b
$ \CString
cScheme ->
forall a b res.
(a -> (b -> res) -> res) -> [a] -> ([b] -> res) -> res
withMany forall a. String -> (CString -> IO a) -> IO a
withCString (forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst [(String, String)]
keysAndValues) forall a b. (a -> b) -> a -> b
$ \[CString]
cKeys ->
forall a b res.
(a -> (b -> res) -> res) -> [a] -> ([b] -> res) -> res
withMany forall a. String -> (CString -> IO a) -> IO a
withCString (forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> b
snd [(String, String)]
keysAndValues) forall a b. (a -> b) -> a -> b
$ \[CString]
cValues ->
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray (forall (t :: * -> *) a. Foldable t => t a -> Int
length [(String, String)]
keysAndValues) forall a b. (a -> b) -> a -> b
$ \Ptr CString
cKeysPtr ->
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray (forall (t :: * -> *) a. Foldable t => t a -> Int
length [(String, String)]
keysAndValues) forall a b. (a -> b) -> a -> b
$ \Ptr CString
cValuesPtr ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult RawOperator)
ffiResultPtr -> do
FunPtr (CUInt -> CString -> IO ())
logFnPtr <- case Maybe (LogAction IO Message)
maybeLogger of
Just LogAction IO Message
logger -> (CUInt -> CString -> IO ())
-> IO (FunPtr (CUInt -> CString -> IO ()))
wrapLogFn (forall {a} {sev}.
(Integral a, Enum sev) =>
LogAction IO (Msg sev) -> a -> CString -> IO ()
logFn LogAction IO Message
logger)
Maybe (LogAction IO Message)
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. FunPtr a
nullFunPtr
forall a. Storable a => Ptr a -> [a] -> IO ()
pokeArray Ptr CString
cKeysPtr [CString]
cKeys
forall a. Storable a => Ptr a -> [a] -> IO ()
pokeArray Ptr CString
cValuesPtr [CString]
cValues
CString
-> Ptr CString
-> Ptr CString
-> CSize
-> FunPtr (CUInt -> CString -> IO ())
-> Ptr (FFIResult RawOperator)
-> IO ()
c_via_map_ffi CString
cScheme Ptr CString
cKeysPtr Ptr CString
cValuesPtr (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t a -> Int
length [(String, String)]
keysAndValues) FunPtr (CUInt -> CString -> IO ())
logFnPtr Ptr (FFIResult RawOperator)
ffiResultPtr
FFIResult RawOperator
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult RawOperator)
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult RawOperator
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then do
Operator
op <- ForeignPtr RawOperator -> Operator
Operator forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FunPtr (Ptr RawOperator -> IO ())
c_free_operator (forall a. FFIResult a -> Ptr a
dataPtr FFIResult RawOperator
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right Operator
op
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult RawOperator
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult RawOperator
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg
where
logFn :: LogAction IO (Msg sev) -> a -> CString -> IO ()
logFn LogAction IO (Msg sev)
logger a
enumSeverity CString
cStr = do
String
str <- CString -> IO String
peekCString CString
cStr
LogAction IO (Msg sev)
logger forall (m :: * -> *) msg. LogAction m msg -> msg -> m ()
<& forall sev. sev -> CallStack -> Text -> Msg sev
Msg (forall a. Enum a => Int -> a
toEnum (forall a b. (Integral a, Num b) => a -> b
fromIntegral a
enumSeverity)) CallStack
emptyCallStack (String -> Text
pack String
str)
readOpRaw :: Operator -> String -> IO (Either OpenDALError ByteString)
readOpRaw :: Operator -> String -> IO (Either OpenDALError ByteString)
readOpRaw (Operator ForeignPtr RawOperator
op) String
path = forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr RawOperator
op forall a b. (a -> b) -> a -> b
$ \Ptr RawOperator
opptr ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
path forall a b. (a -> b) -> a -> b
$ \CString
cPath ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult ByteSlice)
ffiResultPtr -> do
Ptr RawOperator -> CString -> Ptr (FFIResult ByteSlice) -> IO ()
c_blocking_read Ptr RawOperator
opptr CString
cPath Ptr (FFIResult ByteSlice)
ffiResultPtr
FFIResult ByteSlice
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult ByteSlice)
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult ByteSlice
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then do
ByteSlice
byteslice <- forall a. Storable a => Ptr a -> IO a
peek forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> Ptr a
dataPtr FFIResult ByteSlice
ffiResult
ByteString
byte <- ByteSlice -> IO ByteString
byteSliceToByteString ByteSlice
byteslice
CString -> CSize -> IO ()
c_free_byteslice (ByteSlice -> CString
bsData ByteSlice
byteslice) (ByteSlice -> CSize
bsLen ByteSlice
byteslice)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right ByteString
byte
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult ByteSlice
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult ByteSlice
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg
writeOpRaw :: Operator -> String -> ByteString -> IO (Either OpenDALError ())
writeOpRaw :: Operator -> String -> ByteString -> IO (Either OpenDALError ())
writeOpRaw (Operator ForeignPtr RawOperator
op) String
path ByteString
byte = forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr RawOperator
op forall a b. (a -> b) -> a -> b
$ \Ptr RawOperator
opptr ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
path forall a b. (a -> b) -> a -> b
$ \CString
cPath ->
forall a. ByteString -> (CStringLen -> IO a) -> IO a
BS.useAsCStringLen ByteString
byte forall a b. (a -> b) -> a -> b
$ \(CString
cByte, Int
len) ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult ())
ffiResultPtr -> do
Ptr RawOperator
-> CString -> CString -> CSize -> Ptr (FFIResult ()) -> IO ()
c_blocking_write Ptr RawOperator
opptr CString
cPath CString
cByte (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len) Ptr (FFIResult ())
ffiResultPtr
FFIResult ()
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult ())
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult ()
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right ()
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult ()
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult ()
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg
isExistOpRaw :: Operator -> String -> IO (Either OpenDALError Bool)
isExistOpRaw :: Operator -> String -> IO (Either OpenDALError Bool)
isExistOpRaw (Operator ForeignPtr RawOperator
op) String
path = forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr RawOperator
op forall a b. (a -> b) -> a -> b
$ \Ptr RawOperator
opptr ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
path forall a b. (a -> b) -> a -> b
$ \CString
cPath ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult CBool)
ffiResultPtr -> do
Ptr RawOperator -> CString -> Ptr (FFIResult CBool) -> IO ()
c_blocking_is_exist Ptr RawOperator
opptr CString
cPath Ptr (FFIResult CBool)
ffiResultPtr
FFIResult CBool
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult CBool)
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult CBool
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then do
CBool
val <- forall a. Storable a => Ptr a -> IO a
peek forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> Ptr a
dataPtr FFIResult CBool
ffiResult
let isExist :: Bool
isExist = CBool
val forall a. Eq a => a -> a -> Bool
/= CBool
0
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right Bool
isExist
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult CBool
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult CBool
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg
createDirOpRaw :: Operator -> String -> IO (Either OpenDALError ())
createDirOpRaw :: Operator -> String -> IO (Either OpenDALError ())
createDirOpRaw (Operator ForeignPtr RawOperator
op) String
path = forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr RawOperator
op forall a b. (a -> b) -> a -> b
$ \Ptr RawOperator
opptr ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
path forall a b. (a -> b) -> a -> b
$ \CString
cPath ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult ())
ffiResultPtr -> do
Ptr RawOperator -> CString -> Ptr (FFIResult ()) -> IO ()
c_blocking_create_dir Ptr RawOperator
opptr CString
cPath Ptr (FFIResult ())
ffiResultPtr
FFIResult ()
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult ())
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult ()
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right ()
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult ()
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult ()
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg
copyOpRaw :: Operator -> String -> String -> IO (Either OpenDALError ())
copyOpRaw :: Operator -> String -> String -> IO (Either OpenDALError ())
copyOpRaw (Operator ForeignPtr RawOperator
op) String
srcPath String
dstPath = forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr RawOperator
op forall a b. (a -> b) -> a -> b
$ \Ptr RawOperator
opptr ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
srcPath forall a b. (a -> b) -> a -> b
$ \CString
cSrcPath ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
dstPath forall a b. (a -> b) -> a -> b
$ \CString
cDstPath ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult ())
ffiResultPtr -> do
Ptr RawOperator
-> CString -> CString -> Ptr (FFIResult ()) -> IO ()
c_blocking_copy Ptr RawOperator
opptr CString
cSrcPath CString
cDstPath Ptr (FFIResult ())
ffiResultPtr
FFIResult ()
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult ())
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult ()
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right ()
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult ()
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult ()
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg
renameOpRaw :: Operator -> String -> String -> IO (Either OpenDALError ())
renameOpRaw :: Operator -> String -> String -> IO (Either OpenDALError ())
renameOpRaw (Operator ForeignPtr RawOperator
op) String
srcPath String
dstPath = forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr RawOperator
op forall a b. (a -> b) -> a -> b
$ \Ptr RawOperator
opptr ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
srcPath forall a b. (a -> b) -> a -> b
$ \CString
cSrcPath ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
dstPath forall a b. (a -> b) -> a -> b
$ \CString
cDstPath ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult ())
ffiResultPtr -> do
Ptr RawOperator
-> CString -> CString -> Ptr (FFIResult ()) -> IO ()
c_blocking_rename Ptr RawOperator
opptr CString
cSrcPath CString
cDstPath Ptr (FFIResult ())
ffiResultPtr
FFIResult ()
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult ())
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult ()
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right ()
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult ()
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult ()
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg
deleteOpRaw :: Operator -> String -> IO (Either OpenDALError ())
deleteOpRaw :: Operator -> String -> IO (Either OpenDALError ())
deleteOpRaw (Operator ForeignPtr RawOperator
op) String
path = forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr RawOperator
op forall a b. (a -> b) -> a -> b
$ \Ptr RawOperator
opptr ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
path forall a b. (a -> b) -> a -> b
$ \CString
cPath ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult ())
ffiResultPtr -> do
Ptr RawOperator -> CString -> Ptr (FFIResult ()) -> IO ()
c_blocking_delete Ptr RawOperator
opptr CString
cPath Ptr (FFIResult ())
ffiResultPtr
FFIResult ()
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult ())
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult ()
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right ()
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult ()
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult ()
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg
statOpRaw :: Operator -> String -> IO (Either OpenDALError Metadata)
statOpRaw :: Operator -> String -> IO (Either OpenDALError Metadata)
statOpRaw (Operator ForeignPtr RawOperator
op) String
path = forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr RawOperator
op forall a b. (a -> b) -> a -> b
$ \Ptr RawOperator
opptr ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
path forall a b. (a -> b) -> a -> b
$ \CString
cPath ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult FFIMetadata)
ffiResultPtr -> do
Ptr RawOperator -> CString -> Ptr (FFIResult FFIMetadata) -> IO ()
c_blocking_stat Ptr RawOperator
opptr CString
cPath Ptr (FFIResult FFIMetadata)
ffiResultPtr
FFIResult FFIMetadata
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult FFIMetadata)
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult FFIMetadata
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then do
FFIMetadata
ffimatadata <- forall a. Storable a => Ptr a -> IO a
peek forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> Ptr a
dataPtr FFIResult FFIMetadata
ffiResult
Metadata
metadata <- FFIMetadata -> IO Metadata
parseFFIMetadata FFIMetadata
ffimatadata
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right Metadata
metadata
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult FFIMetadata
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult FFIMetadata
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg
listOpRaw :: Operator -> String -> IO (Either OpenDALError Lister)
listOpRaw :: Operator -> String -> IO (Either OpenDALError Lister)
listOpRaw (Operator ForeignPtr RawOperator
op) String
path = forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr RawOperator
op forall a b. (a -> b) -> a -> b
$ \Ptr RawOperator
opptr ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
path forall a b. (a -> b) -> a -> b
$ \CString
cPath ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult (Ptr RawLister))
ffiResultPtr -> do
Ptr RawOperator
-> CString -> Ptr (FFIResult (Ptr RawLister)) -> IO ()
c_blocking_list Ptr RawOperator
opptr CString
cPath Ptr (FFIResult (Ptr RawLister))
ffiResultPtr
FFIResult (Ptr RawLister)
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult (Ptr RawLister))
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult (Ptr RawLister)
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then do
Ptr RawLister
ffilister <- forall a. Storable a => Ptr a -> IO a
peek forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> Ptr a
dataPtr FFIResult (Ptr RawLister)
ffiResult
Lister
lister <- ForeignPtr RawLister -> Lister
Lister forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FunPtr (Ptr RawLister -> IO ())
c_free_lister Ptr RawLister
ffilister
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right Lister
lister
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult (Ptr RawLister)
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult (Ptr RawLister)
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg
scanOpRaw :: Operator -> String -> IO (Either OpenDALError Lister)
scanOpRaw :: Operator -> String -> IO (Either OpenDALError Lister)
scanOpRaw (Operator ForeignPtr RawOperator
op) String
path = forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr RawOperator
op forall a b. (a -> b) -> a -> b
$ \Ptr RawOperator
opptr ->
forall a. String -> (CString -> IO a) -> IO a
withCString String
path forall a b. (a -> b) -> a -> b
$ \CString
cPath ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult (Ptr RawLister))
ffiResultPtr -> do
Ptr RawOperator
-> CString -> Ptr (FFIResult (Ptr RawLister)) -> IO ()
c_blocking_scan Ptr RawOperator
opptr CString
cPath Ptr (FFIResult (Ptr RawLister))
ffiResultPtr
FFIResult (Ptr RawLister)
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult (Ptr RawLister))
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult (Ptr RawLister)
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then do
Ptr RawLister
ffilister <- forall a. Storable a => Ptr a -> IO a
peek forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> Ptr a
dataPtr FFIResult (Ptr RawLister)
ffiResult
Lister
lister <- ForeignPtr RawLister -> Lister
Lister forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FunPtr (Ptr RawLister -> IO ())
c_free_lister Ptr RawLister
ffilister
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right Lister
lister
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult (Ptr RawLister)
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult (Ptr RawLister)
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg
nextLister :: Lister -> IO (Either OpenDALError (Maybe String))
nextLister :: Lister -> IO (Either OpenDALError (Maybe String))
nextLister (Lister ForeignPtr RawLister
lister) = forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr RawLister
lister forall a b. (a -> b) -> a -> b
$ \Ptr RawLister
listerptr ->
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr (FFIResult CString)
ffiResultPtr -> do
Ptr RawLister -> Ptr (FFIResult CString) -> IO ()
c_lister_next Ptr RawLister
listerptr Ptr (FFIResult CString)
ffiResultPtr
FFIResult CString
ffiResult <- forall a. Storable a => Ptr a -> IO a
peek Ptr (FFIResult CString)
ffiResultPtr
if forall a. FFIResult a -> CUInt
ffiCode FFIResult CString
ffiResult forall a. Eq a => a -> a -> Bool
== CUInt
0
then do
CString
val <- forall a. Storable a => Ptr a -> IO a
peek forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> Ptr a
dataPtr FFIResult CString
ffiResult
forall a b. b -> Either a b
Right forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CString -> IO (Maybe String)
parseCString CString
val
else do
let code :: ErrorCode
code = Int -> ErrorCode
parseErrorCode forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. FFIResult a -> CUInt
ffiCode FFIResult CString
ffiResult
String
errMsg <- CString -> IO String
peekCString (forall a. FFIResult a -> CString
errorMessage FFIResult CString
ffiResult)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ ErrorCode -> String -> OpenDALError
OpenDALError ErrorCode
code String
errMsg