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"
|
|
|
|
|
2020-06-18 01:29:54 +03:00
|
|
|
js_try_catch_lasterr_Int : String -> String
|
|
|
|
js_try_catch_lasterr_Int x = "{try{" ++ x ++ ";return 0n}catch(e){process.__lasterr = e; return 1n}}"
|
|
|
|
|
2020-05-18 15:59:07 +03:00
|
|
|
%foreign support "idris2_fileErrno"
|
2020-06-18 01:29:54 +03:00
|
|
|
"node:lambda:()=>-BigInt(process._lasterr.errno)"
|
2020-05-18 15:59:07 +03:00
|
|
|
prim_fileErrno : PrimIO Int
|
|
|
|
|
|
|
|
returnError : IO (Either FileError a)
|
|
|
|
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 : a -> IO (Either FileError a)
|
|
|
|
ok x = pure (Right x)
|
|
|
|
|
|
|
|
%foreign support "idris2_currentDirectory"
|
2020-06-18 01:29:54 +03:00
|
|
|
"node:lambda:()=>process.cwd()"
|
2020-05-18 15:59:07 +03:00
|
|
|
prim_currentDir : PrimIO (Ptr String)
|
|
|
|
|
|
|
|
%foreign support "idris2_changeDir"
|
2020-06-18 01:29:54 +03:00
|
|
|
("node:lambda:d=>" ++ js_try_catch_lasterr_Int "process.chdir(d)")
|
2020-05-18 15:59:07 +03:00
|
|
|
prim_changeDir : String -> PrimIO Int
|
|
|
|
|
|
|
|
%foreign support "idris2_createDir"
|
2020-06-18 01:29:54 +03:00
|
|
|
("node:lambdaRequire:fs:d=>" ++ js_try_catch_lasterr_Int "__require_fs.mkdirSync(d)")
|
2020-05-18 15:59:07 +03:00
|
|
|
prim_createDir : String -> PrimIO Int
|
|
|
|
|
2020-05-21 15:32:35 +03:00
|
|
|
%foreign support "idris2_openDir"
|
2020-05-18 15:59:07 +03:00
|
|
|
prim_openDir : String -> PrimIO DirPtr
|
|
|
|
|
2020-05-21 15:32:35 +03:00
|
|
|
%foreign support "idris2_closeDir"
|
2020-05-18 15:59:07 +03:00
|
|
|
prim_closeDir : DirPtr -> PrimIO ()
|
|
|
|
|
2020-05-21 15:32:35 +03:00
|
|
|
%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 : String -> IO (Either FileError ())
|
|
|
|
createDir dir
|
|
|
|
= do res <- primIO (prim_createDir dir)
|
|
|
|
if res == 0
|
|
|
|
then ok ()
|
|
|
|
else returnError
|
|
|
|
|
|
|
|
export
|
|
|
|
changeDir : String -> IO Bool
|
|
|
|
changeDir dir
|
|
|
|
= do ok <- primIO (prim_changeDir dir)
|
|
|
|
pure (ok == 0)
|
|
|
|
|
|
|
|
export
|
|
|
|
currentDir : IO (Maybe String)
|
|
|
|
currentDir
|
|
|
|
= do res <- primIO prim_currentDir
|
|
|
|
if prim__nullPtr res /= 0
|
|
|
|
then pure Nothing
|
|
|
|
else pure (Just (prim__getString res))
|
|
|
|
|
|
|
|
export
|
2020-05-21 15:32:35 +03:00
|
|
|
openDir : 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
|
2020-05-21 15:32:35 +03:00
|
|
|
closeDir : 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
|
2020-05-21 15:32:35 +03:00
|
|
|
removeDir : 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 : Directory -> IO (Either FileError String)
|
|
|
|
dirEntry (MkDir d)
|
|
|
|
= do res <- primIO (prim_dirEntry d)
|
|
|
|
if prim__nullPtr res /= 0
|
|
|
|
then returnError
|
|
|
|
else ok (prim__getString res)
|