diff options
| author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2019-08-14 17:03:02 +0200 |
|---|---|---|
| committer | Ryan Dahl <ry@tinyclouds.org> | 2019-08-14 11:03:02 -0400 |
| commit | e6c349af9f7260c2c4ec713bd231fe554240721e (patch) | |
| tree | 7671dabb8270cc0c2d7f7f5a3b5f5d8d4b1e0986 /cli/ops/os.rs | |
| parent | 58f0e9b9b1b53ca486ef38ae662b98cbde839248 (diff) | |
split up ops.rs (#2753)
Note cli/dispatch_minimal.rs ops are not yet included in cli/ops.
This is part of work towards #2730
Diffstat (limited to 'cli/ops/os.rs')
| -rw-r--r-- | cli/ops/os.rs | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/cli/ops/os.rs b/cli/ops/os.rs new file mode 100644 index 000000000..cd165aa05 --- /dev/null +++ b/cli/ops/os.rs @@ -0,0 +1,220 @@ +// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. +use crate::ansi; +use crate::fs as deno_fs; +use crate::msg; +use crate::msg_util; +use crate::ops::empty_buf; +use crate::ops::ok_buf; +use crate::ops::serialize_response; +use crate::ops::CliOpResult; +use crate::state::ThreadSafeState; +use crate::version; +use atty; +use deno::*; +use flatbuffers::FlatBufferBuilder; +use log; +use url::Url; + +pub fn op_start( + state: &ThreadSafeState, + base: &msg::Base<'_>, + data: Option<PinnedBuf>, +) -> CliOpResult { + assert!(data.is_none()); + let mut builder = FlatBufferBuilder::new(); + + let state = state; + let argv = state.argv.iter().map(String::as_str).collect::<Vec<_>>(); + let argv_off = builder.create_vector_of_strings(argv.as_slice()); + + let cwd_path = std::env::current_dir().unwrap(); + let cwd_off = + builder.create_string(deno_fs::normalize_path(cwd_path.as_ref()).as_ref()); + + let v8_version = version::v8(); + let v8_version_off = builder.create_string(v8_version); + + let deno_version = version::DENO; + let deno_version_off = builder.create_string(deno_version); + + let main_module = state + .main_module() + .map(|m| builder.create_string(&m.to_string())); + + let xeval_delim = state + .flags + .xeval_delim + .clone() + .map(|m| builder.create_string(&m)); + + let debug_flag = state + .flags + .log_level + .map_or(false, |l| l == log::Level::Debug); + + let inner = msg::StartRes::create( + &mut builder, + &msg::StartResArgs { + cwd: Some(cwd_off), + pid: std::process::id(), + argv: Some(argv_off), + main_module, + debug_flag, + version_flag: state.flags.version, + v8_version: Some(v8_version_off), + deno_version: Some(deno_version_off), + no_color: !ansi::use_color(), + xeval_delim, + ..Default::default() + }, + ); + + ok_buf(serialize_response( + base.cmd_id(), + &mut builder, + msg::BaseArgs { + inner_type: msg::Any::StartRes, + inner: Some(inner.as_union_value()), + ..Default::default() + }, + )) +} + +pub fn op_home_dir( + state: &ThreadSafeState, + base: &msg::Base<'_>, + data: Option<PinnedBuf>, +) -> CliOpResult { + assert!(data.is_none()); + let cmd_id = base.cmd_id(); + + state.check_env()?; + + let builder = &mut FlatBufferBuilder::new(); + let path = dirs::home_dir() + .unwrap_or_default() + .into_os_string() + .into_string() + .unwrap_or_default(); + let path = Some(builder.create_string(&path)); + let inner = msg::HomeDirRes::create(builder, &msg::HomeDirResArgs { path }); + + ok_buf(serialize_response( + cmd_id, + builder, + msg::BaseArgs { + inner: Some(inner.as_union_value()), + inner_type: msg::Any::HomeDirRes, + ..Default::default() + }, + )) +} + +pub fn op_exec_path( + state: &ThreadSafeState, + base: &msg::Base<'_>, + data: Option<PinnedBuf>, +) -> CliOpResult { + assert!(data.is_none()); + let cmd_id = base.cmd_id(); + + state.check_env()?; + + let builder = &mut FlatBufferBuilder::new(); + let current_exe = std::env::current_exe().unwrap(); + // Now apply URL parser to current exe to get fully resolved path, otherwise we might get + // `./` and `../` bits in `exec_path` + let exe_url = Url::from_file_path(current_exe).unwrap(); + let path = exe_url.to_file_path().unwrap().to_str().unwrap().to_owned(); + let path = Some(builder.create_string(&path)); + let inner = msg::ExecPathRes::create(builder, &msg::ExecPathResArgs { path }); + + ok_buf(serialize_response( + cmd_id, + builder, + msg::BaseArgs { + inner: Some(inner.as_union_value()), + inner_type: msg::Any::ExecPathRes, + ..Default::default() + }, + )) +} + +pub fn op_set_env( + state: &ThreadSafeState, + base: &msg::Base<'_>, + data: Option<PinnedBuf>, +) -> CliOpResult { + assert!(data.is_none()); + let inner = base.inner_as_set_env().unwrap(); + let key = inner.key().unwrap(); + let value = inner.value().unwrap(); + state.check_env()?; + std::env::set_var(key, value); + ok_buf(empty_buf()) +} + +pub fn op_env( + state: &ThreadSafeState, + base: &msg::Base<'_>, + data: Option<PinnedBuf>, +) -> CliOpResult { + assert!(data.is_none()); + let cmd_id = base.cmd_id(); + + state.check_env()?; + + let builder = &mut FlatBufferBuilder::new(); + let vars: Vec<_> = std::env::vars() + .map(|(key, value)| msg_util::serialize_key_value(builder, &key, &value)) + .collect(); + let tables = builder.create_vector(&vars); + let inner = msg::EnvironRes::create( + builder, + &msg::EnvironResArgs { map: Some(tables) }, + ); + let response_buf = serialize_response( + cmd_id, + builder, + msg::BaseArgs { + inner: Some(inner.as_union_value()), + inner_type: msg::Any::EnvironRes, + ..Default::default() + }, + ); + ok_buf(response_buf) +} + +pub fn op_exit( + _state: &ThreadSafeState, + base: &msg::Base<'_>, + _data: Option<PinnedBuf>, +) -> CliOpResult { + let inner = base.inner_as_exit().unwrap(); + std::process::exit(inner.code()) +} + +pub fn op_is_tty( + _state: &ThreadSafeState, + base: &msg::Base<'_>, + _data: Option<PinnedBuf>, +) -> CliOpResult { + let builder = &mut FlatBufferBuilder::new(); + let inner = msg::IsTTYRes::create( + builder, + &msg::IsTTYResArgs { + stdin: atty::is(atty::Stream::Stdin), + stdout: atty::is(atty::Stream::Stdout), + stderr: atty::is(atty::Stream::Stderr), + }, + ); + ok_buf(serialize_response( + base.cmd_id(), + builder, + msg::BaseArgs { + inner: Some(inner.as_union_value()), + inner_type: msg::Any::IsTTYRes, + ..Default::default() + }, + )) +} |
