diff options
author | Casper Beyer <caspervonb@pm.me> | 2020-06-20 21:46:10 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-20 09:46:10 -0400 |
commit | 86f92e04c79be81f98e5899638cb6fdb29a4fa64 (patch) | |
tree | b106b4551d9ec2e842beefdb4d0f921e27b03aa1 /cli/ops/fs.rs | |
parent | bdf2d26ba1879b2ebeffd4b3a52e23e9254d4f05 (diff) |
feat(unstable): add Deno.ftruncate and ftruncateSync (#6243)
Diffstat (limited to 'cli/ops/fs.rs')
-rw-r--r-- | cli/ops/fs.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/cli/ops/fs.rs b/cli/ops/fs.rs index 63b3ad7f5..9ca4b31ae 100644 --- a/cli/ops/fs.rs +++ b/cli/ops/fs.rs @@ -36,6 +36,7 @@ pub fn init(i: &mut CoreIsolate, s: &State) { i.register_op("op_link", s.stateful_json_op(op_link)); i.register_op("op_symlink", s.stateful_json_op(op_symlink)); i.register_op("op_read_link", s.stateful_json_op(op_read_link)); + i.register_op("op_ftruncate", s.stateful_json_op2(op_ftruncate)); i.register_op("op_truncate", s.stateful_json_op(op_truncate)); i.register_op("op_make_temp_dir", s.stateful_json_op(op_make_temp_dir)); i.register_op("op_make_temp_file", s.stateful_json_op(op_make_temp_file)); @@ -785,6 +786,52 @@ fn op_read_link( #[derive(Deserialize)] #[serde(rename_all = "camelCase")] +struct FtruncateArgs { + promise_id: Option<u64>, + rid: i32, + len: i32, +} + +fn op_ftruncate( + isolate_state: &mut CoreIsolateState, + state: &State, + args: Value, + _zero_copy: &mut [ZeroCopyBuf], +) -> Result<JsonOp, OpError> { + state.check_unstable("Deno.ftruncate"); + let args: FtruncateArgs = serde_json::from_value(args)?; + let rid = args.rid as u32; + let len = args.len as u64; + + let resource_table = isolate_state.resource_table.clone(); + let is_sync = args.promise_id.is_none(); + + if is_sync { + let mut resource_table = resource_table.borrow_mut(); + std_file_resource(&mut resource_table, rid, |r| match r { + Ok(std_file) => std_file.set_len(len).map_err(OpError::from), + Err(_) => Err(OpError::type_error( + "cannot truncate this type of resource".to_string(), + )), + })?; + Ok(JsonOp::Sync(json!({}))) + } else { + let fut = async move { + let mut resource_table = resource_table.borrow_mut(); + std_file_resource(&mut resource_table, rid, |r| match r { + Ok(std_file) => std_file.set_len(len).map_err(OpError::from), + Err(_) => Err(OpError::type_error( + "cannot truncate this type of resource".to_string(), + )), + })?; + Ok(json!({})) + }; + Ok(JsonOp::Async(fut.boxed_local())) + } +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] struct TruncateArgs { promise_id: Option<u64>, path: String, |