From 6b3be01a00d9eaa134a5e58570239d6c1cd3bf54 Mon Sep 17 00:00:00 2001 From: Casper Beyer Date: Mon, 22 Jun 2020 20:58:52 +0800 Subject: feat(unstable): add Deno.fstatSync and fstat (#6425) --- cli/ops/fs.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'cli/ops') diff --git a/cli/ops/fs.rs b/cli/ops/fs.rs index 9417c112d..7c8100605 100644 --- a/cli/ops/fs.rs +++ b/cli/ops/fs.rs @@ -23,6 +23,7 @@ pub fn init(i: &mut CoreIsolate, s: &State) { i.register_op("op_open", s.stateful_json_op2(op_open)); i.register_op("op_seek", s.stateful_json_op2(op_seek)); i.register_op("op_fsync", s.stateful_json_op2(op_fsync)); + i.register_op("op_fstat", s.stateful_json_op2(op_fstat)); i.register_op("op_umask", s.stateful_json_op(op_umask)); i.register_op("op_chdir", s.stateful_json_op(op_chdir)); i.register_op("op_mkdir", s.stateful_json_op(op_mkdir)); @@ -250,6 +251,51 @@ fn op_fsync( } } +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +struct FstatArgs { + promise_id: Option, + rid: i32, +} + +fn op_fstat( + isolate_state: &mut CoreIsolateState, + state: &State, + args: Value, + _zero_copy: &mut [ZeroCopyBuf], +) -> Result { + state.check_unstable("Deno.fstat"); + let args: FstatArgs = serde_json::from_value(args)?; + let rid = args.rid as u32; + + 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(); + let metadata = std_file_resource(&mut resource_table, rid, |r| match r { + Ok(std_file) => std_file.metadata().map_err(OpError::from), + Err(_) => Err(OpError::type_error( + "cannot stat this type of resource".to_string(), + )), + })?; + Ok(JsonOp::Sync(get_stat_json(metadata).unwrap())) + } else { + let fut = async move { + let mut resource_table = resource_table.borrow_mut(); + let metadata = + std_file_resource(&mut resource_table, rid, |r| match r { + Ok(std_file) => std_file.metadata().map_err(OpError::from), + Err(_) => Err(OpError::type_error( + "cannot stat this type of resource".to_string(), + )), + })?; + Ok(get_stat_json(metadata).unwrap()) + }; + Ok(JsonOp::Async(fut.boxed_local())) + } +} + #[derive(Deserialize)] struct UmaskArgs { mask: Option, -- cgit v1.2.3