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(