diff --git a/src/std_fns.rs b/src/std_fns.rs
index 5962e95..84693f0 100644
--- a/src/std_fns.rs
+++ b/src/std_fns.rs
@@ -1085,9 +1085,52 @@ pub fn from_properties(stack: &mut Stack) -> OError {
Ok(())
}
+pub fn list_files(stack: &mut Stack) -> OError {
+ require_on_stack!(dir, Str, stack, "list-files");
+ stack.push(
+ match fs::read_dir(&dir)
+ .map_err(|_| stack.error(ErrorKind::IO(format!("Not a directory: {}", &dir))))
+ {
+ Ok(it) => Value::Array(
+ it.filter(|x| x.is_ok())
+ .map(|x| {
+ if let Ok(x) = x {
+ Value::Str(x.file_name().to_string_lossy().into_owned()).spl()
+ } else {
+ unreachable!()
+ }
+ })
+ .collect(),
+ )
+ .spl(),
+ Err(_) => Value::Null.spl(),
+ },
+ );
+ Ok(())
+}
+
+pub fn delete_file(stack: &mut Stack) -> OError {
+ require_on_stack!(file, Str, stack, "delete-file");
+ stack.push(Value::Int(if fs::remove_file(file).is_ok() { 1 } else { 0 }).spl());
+ Ok(())
+}
+
+pub fn delete_dir(stack: &mut Stack) -> OError {
+ require_on_stack!(dir, Str, stack, "delete-dir");
+ stack.push(
+ Value::Int(if fs::remove_dir_all(dir).is_ok() {
+ 1
+ } else {
+ 0
+ })
+ .spl(),
+ );
+ Ok(())
+}
+
pub fn register(r: &mut Stack, o: Arc) {
type Fn = fn(&mut Stack) -> OError;
- let fns: [(&str, Fn, u32); 65] = [
+ let fns: [(&str, Fn, u32); 68] = [
("pop", pop, 0),
("dup", dup, 2),
("dup2", dup2, 3),
@@ -1153,6 +1196,9 @@ pub fn register(r: &mut Stack, o: Arc) {
("mega-to-str-radix", mega_to_str_radix, 1),
("properties", properties, 1),
("from-properties", from_properties, 1),
+ ("list-files", list_files, 1),
+ ("delete-file", delete_file, 1),
+ ("delete-dir", delete_dir, 1),
];
for f in fns {
r.define_func(