Idris2/libs/base/System/Directory.idr

99 lines
2.5 KiB
Idris
Raw Normal View History

2020-05-18 15:59:07 +03:00
module System.Directory
import public System.File
public export
DirPtr : Type
DirPtr = AnyPtr
support : String -> String
support fn = "C:" ++ fn ++ ", libidris2_support"
%foreign support "idris2_fileErrno"
prim_fileErrno : PrimIO Int
returnError : MonadIO io => io (Either FileError a)
2020-05-18 15:59:07 +03:00
returnError
= do err <- primIO prim_fileErrno
case err of
0 => pure $ Left FileReadError
1 => pure $ Left FileWriteError
2 => pure $ Left FileNotFound
3 => pure $ Left PermissionDenied
4 => pure $ Left FileExists
_ => pure $ Left (GenericFileError (err-5))
ok : MonadIO io => a -> io (Either FileError a)
2020-05-18 15:59:07 +03:00
ok x = pure (Right x)
%foreign support "idris2_currentDirectory"
prim_currentDir : PrimIO (Ptr String)
%foreign support "idris2_changeDir"
prim_changeDir : String -> PrimIO Int
%foreign support "idris2_createDir"
prim_createDir : String -> PrimIO Int
%foreign support "idris2_openDir"
2020-05-18 15:59:07 +03:00
prim_openDir : String -> PrimIO DirPtr
%foreign support "idris2_closeDir"
2020-05-18 15:59:07 +03:00
prim_closeDir : DirPtr -> PrimIO ()
%foreign support "idris2_removeDir"
prim_removeDir : String -> PrimIO ()
2020-05-18 20:28:33 +03:00
2020-05-18 15:59:07 +03:00
%foreign support "idris2_nextDirEntry"
prim_dirEntry : DirPtr -> PrimIO (Ptr String)
export
data Directory : Type where
MkDir : DirPtr -> Directory
export
createDir : MonadIO io => String -> io (Either FileError ())
2020-05-18 15:59:07 +03:00
createDir dir
= do res <- primIO (prim_createDir dir)
if res == 0
then ok ()
else returnError
export
changeDir : MonadIO io => String -> io Bool
2020-05-18 15:59:07 +03:00
changeDir dir
= do ok <- primIO (prim_changeDir dir)
pure (ok == 0)
export
currentDir : MonadIO io => io (Maybe String)
2020-05-18 15:59:07 +03:00
currentDir
= do res <- primIO prim_currentDir
if prim__nullPtr res /= 0
then pure Nothing
else pure (Just (prim__getString res))
export
openDir : MonadIO io => String -> io (Either FileError Directory)
openDir d
2020-05-18 15:59:07 +03:00
= do res <- primIO (prim_openDir d)
if prim__nullAnyPtr res /= 0
then returnError
else ok (MkDir res)
export
closeDir : HasIO io => Directory -> io ()
closeDir (MkDir d) = primIO (prim_closeDir d)
2020-05-18 15:59:07 +03:00
2020-05-18 20:28:33 +03:00
export
removeDir : HasIO io => String -> io ()
removeDir dirName = primIO (prim_removeDir dirName)
2020-05-18 20:28:33 +03:00
2020-05-18 15:59:07 +03:00
export
dirEntry : MonadIO io => Directory -> io (Either FileError String)
2020-05-18 15:59:07 +03:00
dirEntry (MkDir d)
= do res <- primIO (prim_dirEntry d)
if prim__nullPtr res /= 0
then returnError
else ok (prim__getString res)