Add delete_directory/1 predicate to the files library

This commit is contained in:
Paulo Moura
2021-05-18 08:41:19 +01:00
parent e7d6811948
commit eeac3bc436
3 changed files with 25 additions and 0 deletions

View File

@@ -174,6 +174,7 @@ pub(crate) enum SystemClauseType {
DirectorySeparator,
MakeDirectory,
DeleteFile,
DeleteDirectory,
WorkingDirectory,
PathCanonical,
FileTime,
@@ -335,6 +336,7 @@ impl SystemClauseType {
&SystemClauseType::DirectorySeparator => clause_name!("$directory_separator"),
&SystemClauseType::MakeDirectory => clause_name!("$make_directory"),
&SystemClauseType::DeleteFile => clause_name!("$delete_file"),
&SystemClauseType::DeleteDirectory => clause_name!("$delete_directory"),
&SystemClauseType::WorkingDirectory => clause_name!("$working_directory"),
&SystemClauseType::PathCanonical => clause_name!("$path_canonical"),
&SystemClauseType::FileTime => clause_name!("$file_time"),
@@ -744,6 +746,7 @@ impl SystemClauseType {
("$directory_separator", 1) => Some(SystemClauseType::DirectorySeparator),
("$make_directory", 1) => Some(SystemClauseType::MakeDirectory),
("$delete_file", 1) => Some(SystemClauseType::DeleteFile),
("$delete_directory", 1) => Some(SystemClauseType::DeleteDirectory),
("$working_directory", 2) => Some(SystemClauseType::WorkingDirectory),
("$path_canonical", 2) => Some(SystemClauseType::PathCanonical),
("$file_time", 3) => Some(SystemClauseType::FileTime),

View File

@@ -51,6 +51,7 @@
file_exists/1,
directory_exists/1,
delete_file/1,
delete_directory/1,
make_directory/1,
working_directory/2,
path_canonical/2,
@@ -95,11 +96,21 @@ delete_file(File) :-
list_of_chars(File),
'$delete_file'(File).
delete_directory(Directory) :-
directory_must_exist(Directory, delete_directory/1),
list_of_chars(Directory),
'$delete_directory'(Directory).
file_must_exist(File, Context) :-
( file_exists(File) -> true
; throw(error(existence_error(file, File), Context))
).
directory_must_exist(Directory, Context) :-
( directory_exists(Directory) -> true
; throw(error(existence_error(directory, Directory), Context))
).
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Dir0 is the current working directory, and the working directory
is changed to Dir.

View File

@@ -889,6 +889,17 @@ impl MachineState {
}
}
}
&SystemClauseType::DeleteDirectory => {
let directory = self.heap_pstr_iter(self[temp_v!(1)]).to_string();
match fs::remove_dir(directory) {
Ok(_) => {}
_ => {
self.fail = true;
return Ok(());
}
}
}
&SystemClauseType::WorkingDirectory => {
if let Ok(dir) = env::current_dir() {
let current = match dir.to_str() {