summaryrefslogtreecommitdiff
path: root/cli/ops
diff options
context:
space:
mode:
Diffstat (limited to 'cli/ops')
-rw-r--r--cli/ops/fs.rs47
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,