summaryrefslogtreecommitdiff
path: root/src/ops.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ops.rs')
-rw-r--r--src/ops.rs53
1 files changed, 49 insertions, 4 deletions
diff --git a/src/ops.rs b/src/ops.rs
index a58532baf..261ed67f5 100644
--- a/src/ops.rs
+++ b/src/ops.rs
@@ -101,6 +101,8 @@ pub fn dispatch(
msg::Any::Listen => op_listen,
msg::Any::Accept => op_accept,
msg::Any::Dial => op_dial,
+ msg::Any::Chdir => op_chdir,
+ msg::Any::Cwd => op_cwd,
msg::Any::Metrics => op_metrics,
_ => panic!(format!(
"Unhandled message {}",
@@ -110,8 +112,7 @@ pub fn dispatch(
op_creator(isolate.state.clone(), &base, data)
};
- let boxed_op = Box::new(
- op.or_else(move |err: DenoError| -> DenoResult<Buf> {
+ let boxed_op = Box::new(op.or_else(move |err: DenoError| -> DenoResult<Buf> {
debug!("op err {}", err);
// No matter whether we got an Err or Ok, we want a serialized message to
// send back. So transform the DenoError into a deno_buf.
@@ -143,8 +144,7 @@ pub fn dispatch(
)
};
Ok(buf)
- }),
- );
+ }));
debug!(
"msg_from_js {} sync {}",
@@ -283,6 +283,20 @@ fn op_code_cache(
}()))
}
+fn op_chdir(
+ _state: Arc<IsolateState>,
+ base: &msg::Base,
+ data: &'static mut [u8],
+) -> Box<Op> {
+ assert_eq!(data.len(), 0);
+ let inner = base.inner_as_chdir().unwrap();
+ let directory = inner.directory().unwrap();
+ Box::new(futures::future::result(|| -> OpResult {
+ let _result = std::env::set_current_dir(&directory)?;
+ Ok(empty_buf())
+ }()))
+}
+
fn op_set_timeout(
isolate: &mut Isolate,
base: &msg::Base,
@@ -811,6 +825,37 @@ fn get_mode(_perm: fs::Permissions) -> u32 {
0
}
+fn op_cwd(
+ _state: Arc<IsolateState>,
+ base: &msg::Base,
+ data: &'static mut [u8],
+) -> Box<Op> {
+ assert_eq!(data.len(), 0);
+ let cmd_id = base.cmd_id();
+ Box::new(futures::future::result(|| -> OpResult {
+ let path = std::env::current_dir()?;
+ let builder = &mut FlatBufferBuilder::new();
+ let cwd =
+ builder.create_string(&path.into_os_string().into_string().unwrap());
+ let inner = msg::CwdRes::create(
+ builder,
+ &msg::CwdResArgs {
+ cwd: Some(cwd),
+ ..Default::default()
+ },
+ );
+ Ok(serialize_response(
+ cmd_id,
+ builder,
+ msg::BaseArgs {
+ inner: Some(inner.as_union_value()),
+ inner_type: msg::Any::CwdRes,
+ ..Default::default()
+ },
+ ))
+ }()))
+}
+
fn op_stat(
_config: Arc<IsolateState>,
base: &msg::Base,