summaryrefslogtreecommitdiff
path: root/cli/compiler.rs
diff options
context:
space:
mode:
authorBert Belder <bertbelder@gmail.com>2019-04-02 05:24:07 +0200
committerBert Belder <bertbelder@gmail.com>2019-04-02 18:04:25 +0200
commit5f1e42f8ac3a051e83908dcdd0c1f9735b32a79a (patch)
tree482eb8ba7a59ab80686f386d929e2d781b75e627 /cli/compiler.rs
parentb735155712b944004ac87ba5d3be7a9baccbf53e (diff)
cli: refactor compile_sync() for readability
Diffstat (limited to 'cli/compiler.rs')
-rw-r--r--cli/compiler.rs109
1 files changed, 36 insertions, 73 deletions
diff --git a/cli/compiler.rs b/cli/compiler.rs
index 80d0ee2c1..410842871 100644
--- a/cli/compiler.rs
+++ b/cli/compiler.rs
@@ -198,84 +198,47 @@ pub fn compile_sync(
referrer: &str,
module_meta_data: &ModuleMetaData,
) -> ModuleMetaData {
- let is_worker = parent_state.is_worker;
+ debug!(
+ "Running rust part of compile_sync. specifier: {}, referrer: {}",
+ &specifier, &referrer
+ );
+
+ let req_msg = req(specifier, referrer, parent_state.is_worker);
+ let module_meta_data_ = module_meta_data.clone();
+
let shared = lazy_start(parent_state);
+ let compiler_rid = shared.rid;
let (local_sender, local_receiver) =
oneshot::channel::<Result<ModuleMetaData, Option<JSError>>>();
- // Just some extra scoping to keep things clean
- {
- let compiler_rid = shared.rid;
- let module_meta_data_ = module_meta_data.clone();
- let req_msg = req(specifier, referrer, is_worker);
- let sender_arc = Arc::new(Some(local_sender));
- let specifier_ = specifier.to_string();
- let referrer_ = referrer.to_string();
-
- let mut runtime = C_RUNTIME.lock().unwrap();
- runtime.spawn(lazy(move || {
- debug!(
- "Running rust part of compile_sync specifier: {} referrer: {}",
- specifier_, referrer_
- );
- let mut send_sender_arc = sender_arc.clone();
- resources::post_message_to_worker(compiler_rid, req_msg)
- .map_err(move |_| {
- let sender = Arc::get_mut(&mut send_sender_arc).unwrap().take();
- sender.unwrap().send(Err(None)).unwrap()
- }).and_then(move |_| {
- debug!(
- "Sent message to worker specifier: {} referrer: {}",
- specifier_, referrer_
- );
- let mut get_sender_arc = sender_arc.clone();
- let mut result_sender_arc = sender_arc.clone();
- resources::get_message_from_worker(compiler_rid)
- .map_err(move |_| {
- let sender = Arc::get_mut(&mut get_sender_arc).unwrap().take();
- sender.unwrap().send(Err(None)).unwrap()
- }).and_then(move |res_msg_option| -> Result<(), ()> {
- debug!(
- "Recieved message from worker specifier: {} referrer: {}",
- specifier_, referrer_
- );
- let res_msg = res_msg_option.unwrap();
- let res_json = std::str::from_utf8(&res_msg).unwrap();
- let sender = Arc::get_mut(&mut result_sender_arc)
- .unwrap()
- .take()
- .unwrap();
- sender
- .send(Ok(match serde_json::from_str::<serde_json::Value>(
- res_json,
- ) {
- Ok(serde_json::Value::Object(map)) => ModuleMetaData {
- module_name: module_meta_data_.module_name.clone(),
- module_redirect_source_name: module_meta_data_
- .module_redirect_source_name
- .clone(),
- filename: module_meta_data_.filename.clone(),
- media_type: module_meta_data_.media_type,
- source_code: module_meta_data_.source_code.clone(),
- maybe_output_code: match map["outputCode"].as_str() {
- Some(str) => Some(str.as_bytes().to_owned()),
- _ => None,
- },
- maybe_output_code_filename: None,
- maybe_source_map: match map["sourceMap"].as_str() {
- Some(str) => Some(str.as_bytes().to_owned()),
- _ => None,
- },
- maybe_source_map_filename: None,
- },
- _ => panic!("error decoding compiler response"),
- })).expect("send failed");
- Ok(())
- })
- })
- }));
- }
+ let mut runtime = C_RUNTIME.lock().unwrap();
+ runtime.spawn(lazy(move || {
+ resources::post_message_to_worker(compiler_rid, req_msg)
+ .then(move |_| {
+ debug!("Sent message to worker");
+ resources::get_message_from_worker(compiler_rid)
+ }).and_then(move |res_msg| {
+ debug!("Received message from worker");
+ let res_json = std::str::from_utf8(res_msg.as_ref().unwrap()).unwrap();
+ let res_data = serde_json::from_str::<serde_json::Value>(res_json)
+ .expect("Error decoding compiler response");
+ let res_module_meta_data = ModuleMetaData {
+ maybe_output_code: res_data["outputCode"]
+ .as_str()
+ .map(|s| s.as_bytes().to_owned()),
+ maybe_source_map: res_data["sourceMap"]
+ .as_str()
+ .map(|s| s.as_bytes().to_owned()),
+ ..module_meta_data_
+ };
+ Ok(res_module_meta_data)
+ }).map_err(|_| None)
+ .then(move |result| {
+ local_sender.send(result).expect("Oneshot send() failed");
+ Ok(())
+ })
+ }));
let worker_receiver = shared.worker_err_receiver.clone();