summaryrefslogtreecommitdiff
path: root/cli/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/main.rs')
-rw-r--r--cli/main.rs140
1 files changed, 140 insertions, 0 deletions
diff --git a/cli/main.rs b/cli/main.rs
new file mode 100644
index 000000000..4657a3a4d
--- /dev/null
+++ b/cli/main.rs
@@ -0,0 +1,140 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+#[macro_use]
+extern crate lazy_static;
+#[macro_use]
+extern crate log;
+#[macro_use]
+extern crate futures;
+#[macro_use]
+extern crate serde_json;
+
+mod ansi;
+pub mod cli;
+pub mod compiler;
+pub mod deno_dir;
+pub mod errors;
+pub mod flags;
+mod fs;
+mod global_timer;
+mod http_body;
+mod http_util;
+pub mod isolate;
+pub mod isolate_state;
+pub mod js_errors;
+pub mod modules;
+pub mod msg;
+pub mod msg_util;
+pub mod ops;
+pub mod permissions;
+mod repl;
+pub mod resolve_addr;
+pub mod resources;
+mod startup_data;
+mod tokio_util;
+mod tokio_write;
+pub mod version;
+pub mod workers;
+
+use crate::cli::Cli;
+use crate::errors::RustOrJsError;
+use crate::isolate::Isolate;
+use crate::isolate_state::IsolateState;
+use futures::lazy;
+use futures::Future;
+use log::{LevelFilter, Metadata, Record};
+use std::env;
+use std::sync::Arc;
+
+static LOGGER: Logger = Logger;
+
+struct Logger;
+
+impl log::Log for Logger {
+ fn enabled(&self, metadata: &Metadata) -> bool {
+ metadata.level() <= log::max_level()
+ }
+
+ fn log(&self, record: &Record) {
+ if self.enabled(record.metadata()) {
+ println!("{} RS - {}", record.level(), record.args());
+ }
+ }
+ fn flush(&self) {}
+}
+
+fn print_err_and_exit(err: RustOrJsError) {
+ eprintln!("{}", err.to_string());
+ std::process::exit(1);
+}
+
+fn js_check<E>(r: Result<(), E>)
+where
+ E: Into<RustOrJsError>,
+{
+ if let Err(err) = r {
+ print_err_and_exit(err.into());
+ }
+}
+
+fn main() {
+ #[cfg(windows)]
+ ansi_term::enable_ansi_support().ok(); // For Windows 10
+
+ log::set_logger(&LOGGER).unwrap();
+ let args = env::args().collect();
+ let (mut flags, mut rest_argv, usage_string) = flags::set_flags(args)
+ .unwrap_or_else(|err| {
+ eprintln!("{}", err);
+ std::process::exit(1)
+ });
+
+ if flags.help {
+ println!("{}", &usage_string);
+ std::process::exit(0);
+ }
+
+ log::set_max_level(if flags.log_debug {
+ LevelFilter::Debug
+ } else {
+ LevelFilter::Warn
+ });
+
+ if flags.fmt {
+ rest_argv.insert(1, "https://deno.land/std/prettier/main.ts".to_string());
+ flags.allow_read = true;
+ flags.allow_write = true;
+ }
+
+ let should_prefetch = flags.prefetch || flags.info;
+ let should_display_info = flags.info;
+
+ let state = Arc::new(IsolateState::new(flags, rest_argv, None));
+ let state_ = state.clone();
+ let startup_data = startup_data::deno_isolate_init();
+ let permissions = permissions::DenoPermissions::from_flags(&state.flags);
+ let cli = Cli::new(Some(startup_data), state_, permissions);
+ let mut isolate = Isolate::new(cli);
+
+ let main_future = lazy(move || {
+ // Setup runtime.
+ js_check(isolate.execute("denoMain()"));
+
+ // Execute main module.
+ if let Some(main_module) = state.main_module() {
+ debug!("main_module {}", main_module);
+ js_check(isolate.execute_mod(&main_module, should_prefetch));
+ if should_display_info {
+ // Display file info and exit. Do not run file
+ isolate.print_file_info(&main_module);
+ std::process::exit(0);
+ }
+ }
+
+ isolate.then(|result| {
+ js_check(result);
+ Ok(())
+ })
+ });
+
+ tokio_util::run(main_future);
+}