From 724589988bb422e4bdcc6aa68869b2053fe5eea6 Mon Sep 17 00:00:00 2001 From: tami5 Date: Mon, 23 May 2022 21:27:00 +0300 Subject: [PATCH] ref(runner): better architecture --- Cargo.lock | 280 +++++++++++++++++----------------- Cargo.toml | 2 +- lua/xbase/lib.rs | 3 +- src/daemon/message.rs | 4 +- src/daemon/requests.rs | 2 +- src/daemon/requests/build.rs | 10 +- src/daemon/requests/run.rs | 73 ++------- src/lib.rs | 2 +- src/nvim/logger.rs | 1 + src/run.rs | 55 +++++++ src/run/bin.rs | 42 +++++ src/run/handler.rs | 63 ++++++++ src/run/meduim.rs | 61 ++++++++ src/run/simulator.rs | 155 +++++++++++++++++++ src/runner.rs | 194 ----------------------- src/runner/simctl.rs | 103 ------------- src/types/build.rs | 17 ++- src/types/project/platform.rs | 6 +- src/watcher/handle/target.rs | 7 +- src/xcode.rs | 2 +- 20 files changed, 564 insertions(+), 518 deletions(-) create mode 100644 src/run.rs create mode 100644 src/run/bin.rs create mode 100644 src/run/handler.rs create mode 100644 src/run/meduim.rs create mode 100644 src/run/simulator.rs delete mode 100644 src/runner.rs delete mode 100644 src/runner/simctl.rs diff --git a/Cargo.lock b/Cargo.lock index 19a18d1..f280e92 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -55,9 +55,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.52" +version = "0.1.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" +checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" dependencies = [ "proc-macro2", "quote", @@ -184,9 +184,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clang-sys" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21" +checksum = "bf6b561dcf059c85bbe388e0a7b0a1469acb3934cc0cfa148613a830629e3049" dependencies = [ "glob", "libc", @@ -195,9 +195,9 @@ dependencies = [ [[package]] name = "const_format" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22bc6cd49b0ec407b680c3e380182b6ac63b73991cb7602de350352fc309b614" +checksum = "0936ffe6d0c8d6a51b3b0a73b2acbe925d786f346cf45bfddc8341d79fb7dc8a" dependencies = [ "const_format_proc_macros", ] @@ -225,9 +225,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" dependencies = [ "cfg-if", "lazy_static", @@ -244,9 +244,9 @@ dependencies = [ [[package]] name = "dirs-sys" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", "redox_users", @@ -261,9 +261,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "erased-serde" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56047058e1ab118075ca22f9ecd737bcc961aa3566a3019cb71388afa280bd8a" +checksum = "ad132dd8d0d0b546348d7d86cb3191aad14b34e5f979781fc005c80d4ac67ffd" dependencies = [ "serde", ] @@ -291,9 +291,9 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" dependencies = [ "cfg-if", "libc", @@ -430,9 +430,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if", "libc", @@ -485,9 +485,9 @@ checksum = "0cfe9645a18782869361d9c8732246be7b410ad4e919d3609ebabdac00ba12c3" [[package]] name = "indexmap" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" dependencies = [ "autocfg", "hashbrown", @@ -533,9 +533,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "joinery" @@ -545,9 +545,9 @@ checksum = "72167d68f5fce3b8655487b8038691a3c9984ee769590f93f2a631f4ad64e4f5" [[package]] name = "kqueue" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058a107a784f8be94c7d35c1300f4facced2e93d2fbe5b1452b44e905ddca4a9" +checksum = "4d6112e8f37b59803ac47a42d14f1f3a59bbf72fc6857ffc5be455e28a691f8e" dependencies = [ "kqueue-sys", "libc", @@ -619,18 +619,19 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] @@ -650,18 +651,18 @@ dependencies = [ [[package]] name = "lua-src" -version = "544.0.0" +version = "544.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7341ba039a781c4982ca20761c55f44e07bfefd496a45b1e929763d88f5fc68b" +checksum = "708ba3c844d5e9d38def4a09dd871c17c370f519b3c4b7261fbabe4a613a814c" dependencies = [ "cc", ] [[package]] name = "luajit-src" -version = "210.3.3+resty673aaad" +version = "210.3.4+resty073ac54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3201eae65820ee1f1eddc22de04f5c834bce36db20c2672d39d47826b317768e" +checksum = "640b09e99575a442b4da0ef406a78188a1a4313bb9ead7b5b20ec12cc480130f" dependencies = [ "cc", ] @@ -683,9 +684,9 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "minimal-lexical" @@ -695,25 +696,14 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "mio" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba42135c6a5917b9db9cd7b293e5409e1c6b041e6f9825e92e55a894c63b6f8" +checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" dependencies = [ "libc", "log", - "miow", - "ntapi", "wasi 0.11.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", + "windows-sys", ] [[package]] @@ -755,13 +745,12 @@ dependencies = [ [[package]] name = "nom" -version = "7.1.0" +version = "7.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" dependencies = [ "memchr", "minimal-lexical", - "version_check", ] [[package]] @@ -779,9 +768,9 @@ dependencies = [ [[package]] name = "notify" -version = "5.0.0-pre.14" +version = "5.0.0-pre.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d13c22db70a63592e098fb51735bab36646821e6389a0ba171f3549facdf0b74" +checksum = "553f9844ad0b0824605c20fb55a661679782680410abfb1a8144c2e7e437e7a7" dependencies = [ "bitflags", "crossbeam-channel", @@ -795,20 +784,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "ntapi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" -dependencies = [ - "winapi", -] - [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] @@ -825,9 +805,9 @@ dependencies = [ [[package]] name = "num_threads" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c539a50b93a303167eded6e8dff5220cd39447409fb659f4cd24b1f72fe4f133" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ "libc", ] @@ -845,14 +825,14 @@ dependencies = [ "rmp", "rmpv", "tokio", - "tokio-util 0.6.9", + "tokio-util 0.6.10", ] [[package]] name = "once_cell" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +checksum = "7b10983b38c53aebdf33f542c6275b0f58a238129d00c4ae0e6fb59738d783ca" [[package]] name = "parity-tokio-ipc" @@ -880,9 +860,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ "cfg-if", "libc", @@ -911,9 +891,9 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -923,9 +903,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "pori" @@ -968,11 +948,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -988,11 +968,22 @@ dependencies = [ "tokio-stream", ] +[[package]] +name = "process-stream" +version = "0.2.1" +dependencies = [ + "async-stream", + "futures 0.3.21", + "tap", + "tokio", + "tokio-stream", +] + [[package]] name = "quote" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] @@ -1040,28 +1031,29 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.5", + "getrandom 0.2.6", "redox_syscall", + "thiserror", ] [[package]] name = "regex" -version = "1.5.5" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" dependencies = [ "aho-corasick", "memchr", @@ -1079,9 +1071,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" [[package]] name = "rmp" @@ -1118,9 +1110,9 @@ checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "same-file" @@ -1139,18 +1131,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", @@ -1170,9 +1162,9 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" +checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" dependencies = [ "proc-macro2", "quote", @@ -1181,9 +1173,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" +checksum = "707d15895415db6628332b737c838b88c598522e4dc70647e59b72312924aebc" dependencies = [ "indexmap", "ryu", @@ -1231,9 +1223,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "smallvec" @@ -1275,13 +1267,13 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.86" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1321,9 +1313,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "004cbc98f30fa233c61a38bc77e96a9106e65c88f2d3bef182ae952027e5753d" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" dependencies = [ "itoa", "libc", @@ -1332,9 +1324,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -1347,9 +1339,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.18.1" +version = "1.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce653fb475565de9f6fb0614b28bca8df2c430c0cf84bcd9c843f15de5414cc" +checksum = "4903bf0427cf68dddd5aa6a93220756f8be0c34fcfa9f5e6191e103e15a31395" dependencies = [ "bytes 1.1.0", "libc", @@ -1400,9 +1392,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ "bytes 1.1.0", "futures-core", @@ -1415,9 +1407,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" +checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c" dependencies = [ "bytes 1.1.0", "futures-core", @@ -1441,9 +1433,9 @@ dependencies = [ [[package]] name = "tracing-appender" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ab026b18a46ac429e5c98bec10ca06424a97b3ad7b3949d9b4a102fff6623c4" +checksum = "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e" dependencies = [ "crossbeam-channel", "time", @@ -1452,9 +1444,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" dependencies = [ "proc-macro2", "quote", @@ -1463,9 +1455,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c" +checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" dependencies = [ "lazy_static", "valuable", @@ -1473,9 +1465,9 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ "lazy_static", "log", @@ -1484,9 +1476,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e0ab7bdc962035a87fba73f3acca9b8a8d0034c2e6f60b84aeaaddddc155dce" +checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" dependencies = [ "ansi_term", "lazy_static", @@ -1502,9 +1494,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" [[package]] name = "unicode-normalization" @@ -1517,9 +1515,9 @@ dependencies = [ [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "url" @@ -1626,9 +1624,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ "windows_aarch64_msvc", "windows_i686_gnu", @@ -1639,33 +1637,33 @@ dependencies = [ [[package]] name = "windows_aarch64_msvc" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_i686_gnu" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_msvc" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_x86_64_gnu" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_msvc" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "xbase" @@ -1684,7 +1682,7 @@ dependencies = [ "notify", "nvim-rs", "parity-tokio-ipc", - "process-stream", + "process-stream 0.2.1", "serde", "serde_json", "serde_yaml", @@ -1694,7 +1692,7 @@ dependencies = [ "tap", "thiserror", "tokio", - "tokio-util 0.7.1", + "tokio-util 0.7.2", "tracing", "tracing-appender", "tracing-subscriber", @@ -1711,7 +1709,7 @@ dependencies = [ "async-stream", "async-trait", "parity-tokio-ipc", - "process-stream", + "process-stream 0.1.3", "shell-words", "tap", "thiserror", diff --git a/Cargo.toml b/Cargo.toml index f728289..19aba70 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -73,7 +73,7 @@ tokio = { version = "1.17.0", features = ["full"], optional = tr tokio-util = { version = "0.7.1", features = ["codec"], optional = true } async-trait = { version = "0.1.52", optional = true } async-stream = { version = "0.3.3", optional = true } -process-stream = { version = "0.1.3", optional = true } +process-stream = { path = "../../rust/process-stream/", optional = true } # Logging Feature tracing = { version = "0.1.32", optional = true } tracing-subscriber = { version = "0.3.9", features = ["env-filter"], optional = true} diff --git a/lua/xbase/lib.rs b/lua/xbase/lib.rs index 000c51c..862c28b 100644 --- a/lua/xbase/lib.rs +++ b/lua/xbase/lib.rs @@ -19,7 +19,7 @@ fn libxbase(l: &Lua) -> LuaResult { ("register", fun!(Register, l)), ("drop", fun!(Drop, l)), ("build", fun!(Build, l)), - ("run", fun!(Run, l)), + ("run", fun!(RunRequest, l)), ("watch_target", fun!(WatchTarget, l)), ]) } @@ -34,6 +34,7 @@ pub fn is_running(_: &Lua, _: ()) -> LuaResult { /// Ensure that daemon is currently running in background pub fn ensure(lua: &Lua, _: ()) -> LuaResult { + // FIXME(dameon): resulting in connection refused if is_running(lua, ()).unwrap() { Ok(false) } else if Command::new(DAEMON_BINARY).spawn().is_ok() { diff --git a/src/daemon/message.rs b/src/daemon/message.rs index 5cb8f57..0357c5c 100644 --- a/src/daemon/message.rs +++ b/src/daemon/message.rs @@ -21,7 +21,7 @@ impl Request { #[derive(Debug, Serialize, Deserialize)] pub enum Message { Build(Build), - Run(Run), + RunRequest(RunRequest), Register(Register), Drop(Drop), RenameFile(RenameFile), @@ -33,7 +33,7 @@ impl Message { pub async fn handle(self) -> crate::Result<()> { match self { Self::Build(c) => Handler::handle(c).await, - Self::Run(c) => Handler::handle(c).await, + Self::RunRequest(c) => Handler::handle(c).await, Self::RenameFile(c) => Handler::handle(c).await, Self::Register(c) => Handler::handle(c).await, Self::Drop(c) => Handler::handle(c).await, diff --git a/src/daemon/requests.rs b/src/daemon/requests.rs index 248162b..4c68e0e 100644 --- a/src/daemon/requests.rs +++ b/src/daemon/requests.rs @@ -45,7 +45,7 @@ macro_rules! convertable { }; } convertable!(Build); -convertable!(Run); +convertable!(RunRequest); convertable!(Register); convertable!(RenameFile); convertable!(Drop); diff --git a/src/daemon/requests/build.rs b/src/daemon/requests/build.rs index 7477b44..e8c985d 100644 --- a/src/daemon/requests/build.rs +++ b/src/daemon/requests/build.rs @@ -4,9 +4,8 @@ use std::fmt::Debug; #[cfg(feature = "daemon")] use { - crate::constants::DAEMON_STATE, - crate::util::serde::value_or_default, - crate::xcode::{append_build_root, build_with_loggger}, + crate::constants::DAEMON_STATE, crate::util::serde::value_or_default, + crate::xcode::build_with_logger, }; /// Build a project. @@ -32,15 +31,14 @@ impl Handler for Build { let nvim = client.nvim(state)?; let direction = self.direction.clone(); - - let args = append_build_root(&root, config.as_args())?; + let args = config.args(&root, &None)?; let ref mut logger = nvim.logger(); logger.set_title(format!("Build:{}", config.target)); logger.set_direction(&direction); - let success = build_with_loggger(logger, &root, &args, true, true).await?; + let success = build_with_logger(logger, root, &args, true, true).await?; if !success { let ref msg = format!("Failed: {} ", config.to_string()); diff --git a/src/daemon/requests/run.rs b/src/daemon/requests/run.rs index dbfb5f0..79a7c46 100644 --- a/src/daemon/requests/run.rs +++ b/src/daemon/requests/run.rs @@ -5,18 +5,12 @@ use { #[cfg(feature = "daemon")] use { - crate::constants::DAEMON_STATE, - crate::runner::Runner, - crate::types::Platform, - crate::util::serde::value_or_default, - crate::xcode::{append_build_root, build_with_loggger}, - crate::Error, - xcodebuild::runner::build_settings, + crate::constants::DAEMON_STATE, crate::run::RunService, crate::util::serde::value_or_default, }; /// Run a project. #[derive(Debug, Serialize, Deserialize)] -pub struct Run { +pub struct RunRequest { pub client: Client, pub config: BuildConfiguration, #[cfg_attr(feature = "daemon", serde(deserialize_with = "value_or_default"))] @@ -27,72 +21,29 @@ pub struct Run { #[cfg(feature = "daemon")] #[async_trait::async_trait] -impl Handler for Run { +impl Handler for RunRequest { async fn handle(self) -> Result<()> { - let Client { root, .. } = &self.client; - - tracing::info!("⚙️ Running command: {}", self.config.to_string()); + tracing::info!("⚙️ Running: {}", self.config.to_string()); let state = DAEMON_STATE.clone(); - let ref state = state.lock().await; - let device = state.devices.from_lookup(self.device); - - let nvim = self.client.nvim(state)?; - let args = { - let mut args = self.config.as_args(); - if let Some(ref device) = device { - args.extend(device.special_build_args()) - } - append_build_root(&root, args)? - }; - - let ref mut logger = nvim.logger(); + let ref mut state = state.lock().await; - logger.set_title(format!("Run:{}", self.config.target)); - logger.set_direction(&self.direction); + // TODO: Insert runner into state.runners + RunService::new(state, self).await?; - let settings = build_settings(&root, &args).await?; - let platform = device - .as_ref() - .map(|d| d.platform.clone()) - .unwrap_or_else(|| Platform::from_display(&settings.platform_display_name).unwrap()); - - let success = build_with_loggger(logger, &root, &args, true, true).await?; - if !success { - let msg = format!("Failed: {} ", self.config.to_string()); - nvim.echo_err(&msg).await?; - return Err(Error::Build(msg)); - } - - // TODO(daemon): insert handler to state.runners - // TODO(nvim): provide mapping to close runners. - // - // If there is more then one runner then pick, else close from current buffer. - // C-c in normal/insert mode should close that process - Runner { - target: self.config.target, - platform, - client: self.client, - args, - udid: device.map(|d| d.udid.clone()), - direction: self.direction, - } - .run(state, settings) - .await?; - - Ok(()) + todo!(); } } #[cfg(feature = "lua")] -impl<'a> Requester<'a, Run> for Run { - fn pre(lua: &Lua, msg: &Run) -> LuaResult<()> { +impl<'a> Requester<'a, RunRequest> for RunRequest { + fn pre(lua: &Lua, msg: &RunRequest) -> LuaResult<()> { lua.print(&msg.to_string()); Ok(()) } } -impl ToString for Run { +impl ToString for RunRequest { fn to_string(&self) -> String { if let Some(ref name) = self.device.name { format!("run [{}] with {}", name, self.config.to_string()) @@ -103,7 +54,7 @@ impl ToString for Run { } #[cfg(feature = "lua")] -impl<'a> FromLua<'a> for Run { +impl<'a> FromLua<'a> for RunRequest { fn from_lua(lua_value: LuaValue<'a>, _lua: &'a Lua) -> LuaResult { let table = match lua_value { LuaValue::Table(t) => Ok(t), diff --git a/src/lib.rs b/src/lib.rs index 406c41b..248a210 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,7 +37,7 @@ pub mod store; mod error; #[cfg(feature = "daemon")] -mod runner; +mod run; #[cfg(any(feature = "daemon", feature = "server"))] pub use error::{CompileError, Error, LoopError, WatchError}; diff --git a/src/nvim/logger.rs b/src/nvim/logger.rs index 2e1bd93..0ace4c7 100644 --- a/src/nvim/logger.rs +++ b/src/nvim/logger.rs @@ -41,6 +41,7 @@ impl<'a> Logger<'a> { }) } + // TODO(logger): append title pub async fn log(&mut self, msg: String) -> Result<()> { tracing::debug!("{msg}"); diff --git a/src/run.rs b/src/run.rs new file mode 100644 index 0000000..5122bcb --- /dev/null +++ b/src/run.rs @@ -0,0 +1,55 @@ +mod bin; +mod handler; +mod meduim; +mod simulator; + +use crate::{ + client::Client, daemon::RunRequest, state::State, types::Device, xcode::build_with_logger, + Error, Result, +}; +use tokio::sync::MutexGuard; +use xcodebuild::runner::build_settings; +use {handler::RunServiceHandler, meduim::RunMedium}; + +/// Run Service +pub struct RunService { + pub client: Client, + pub handler: RunServiceHandler, + pub medium: RunMedium, +} + +impl RunService { + pub async fn new(state: &mut MutexGuard<'_, State>, req: RunRequest) -> Result { + let ref target = req.config.target; + let ref root = req.client.root; + let device = state.devices.from_lookup(req.device); + let build_args = req.config.args(root, &device)?; + let nvim = req.client.nvim(state)?; + + let ref mut logger = nvim.logger(); + + logger.set_title(format!("Run:{target}")); + logger.open_win().await?; + logger.set_direction(&req.direction); + logger.set_running().await?; + + let build_settings = build_settings(root, &build_args).await?; + let build_success = build_with_logger(logger, root, &build_args, false, false).await?; + + if !build_success { + let msg = format!("Failed: {}", req.config); + nvim.echo_err(&msg).await?; + return Err(Error::Build(msg)); + } + + let medium = RunMedium::from_device_or_settings(device, build_settings, req.config)?; + let process = medium.run(logger).await?; + let handler = RunServiceHandler::new(req.client.clone(), process)?; + + Ok(Self { + client: req.client, + handler, + medium, + }) + } +} diff --git a/src/run/bin.rs b/src/run/bin.rs new file mode 100644 index 0000000..cec6f21 --- /dev/null +++ b/src/run/bin.rs @@ -0,0 +1,42 @@ +#![allow(dead_code)] +use crate::types::BuildConfiguration; +use crate::{Error, Result}; +use process_stream::Process; +use std::path::PathBuf; +use xcodebuild::parser::BuildSettings; + +pub struct Bin { + path: PathBuf, + info: BuildSettings, + config: BuildConfiguration, +} + +impl Bin { + pub fn new(info: BuildSettings, config: BuildConfiguration) -> Self { + Self { + path: info.path_to_output_binary().unwrap_or_default(), + info, + config, + } + } + + pub async fn launch(&self) -> Result { + if !self.path.exists() { + return Err(Error::Run(format!("{:?} doesn't exist!", self.path))); + } + + Ok(Process::new(&self.path)) + } + + /// Get a reference to the bin's info. + #[must_use] + pub fn info(&self) -> &BuildSettings { + &self.info + } + + /// Get a reference to the bin's config. + #[must_use] + pub fn config(&self) -> &BuildConfiguration { + &self.config + } +} diff --git a/src/run/handler.rs b/src/run/handler.rs new file mode 100644 index 0000000..50fab9a --- /dev/null +++ b/src/run/handler.rs @@ -0,0 +1,63 @@ +#![allow(dead_code)] +use crate::{client::Client, constants::DAEMON_STATE, Error, Result}; +use process_stream::{Process, StreamExt}; +use tokio::task::JoinHandle; + +/// Run Service Task Handler +pub enum RunServiceHandler { + // Runner is running successfully + Running((Process, JoinHandle>)), + // Runner Errored + Errored(Error), + // Runner Stopped + Stopped(i32), +} + +impl RunServiceHandler { + // Change the status of the process to running + pub fn new(client: Client, mut process: Process) -> Result { + let mut stream = process.spawn_and_stream()?; + let kill_send = process.clone_kill_sender().unwrap(); + + let handler = tokio::spawn(async move { + while let Some(output) = stream.next().await { + let state = DAEMON_STATE.clone(); + let ref state = state.lock().await; + let ref mut logger = match client.nvim(state) { + Ok(nvim) => nvim.logger(), + Err(_) => { + // TODO: Update state to set current handler as Errored + tracing::info!("Nvim Instance closed, closing runner .."); + kill_send.send(()).await.ok(); + break; + } + }; + + use process_stream::ProcessItem::*; + match output { + Output(msg) => { + if !msg.contains("ignoring singular matrix") { + logger.log(msg).await?; + } + } + Error(msg) => { + logger.log(format!("[Error] {msg}")).await?; + } + // TODO: this should be skipped when user re-run the app + Exit(code) => { + let success = &code == "0"; + logger.log(format!("[Exit] {code}")).await?; + logger.set_status_end(success, !success).await?; + break; + } + }; + } + + drop(stream); + + // TODO: Update state to set current handler as stopped + Ok(()) + }); + Ok(Self::Running((process, handler))) + } +} diff --git a/src/run/meduim.rs b/src/run/meduim.rs new file mode 100644 index 0000000..3c6ac8e --- /dev/null +++ b/src/run/meduim.rs @@ -0,0 +1,61 @@ +#![allow(dead_code)] + +use super::{bin::Bin, simulator::Simulator, Device}; +use crate::nvim::Logger; +use crate::types::BuildConfiguration; +use crate::Result; +use process_stream::Process; +use tap::Pipe; +use xcodebuild::parser::BuildSettings; + +/// Runner to run the built binary +pub enum RunMedium { + Simulator(Simulator), + Bin(Bin), +} + +impl RunMedium { + pub fn from_device_or_settings( + device: Option, + settings: BuildSettings, + config: BuildConfiguration, + ) -> Result { + match device { + Some(device) => Self::Simulator(Simulator::new(device, settings, config)), + None => Self::Bin(Bin::new(settings, config)), + } + .pipe(Ok) + } + + pub async fn run<'a>(&self, logger: &mut Logger<'a>) -> Result { + match self { + RunMedium::Simulator(simulator) => { + simulator.boot(logger).await?; + simulator.install(logger).await?; + simulator.launch(logger).await + } + RunMedium::Bin(bin) => bin.launch().await, + } + } + + pub fn config(&self) -> &BuildConfiguration { + match self { + RunMedium::Simulator(s) => s.config(), + RunMedium::Bin(b) => b.config(), + } + } + + pub fn info(&self) -> &BuildSettings { + match self { + RunMedium::Simulator(s) => s.info(), + RunMedium::Bin(b) => b.info(), + } + } + + pub fn target(&self) -> &str { + match self { + RunMedium::Simulator(s) => s.config().target.as_str(), + RunMedium::Bin(b) => b.config().target.as_str(), + } + } +} diff --git a/src/run/simulator.rs b/src/run/simulator.rs new file mode 100644 index 0000000..0a31555 --- /dev/null +++ b/src/run/simulator.rs @@ -0,0 +1,155 @@ +use crate::{ + nvim::Logger, + types::{BuildConfiguration, Device}, + util::{fmt, pid}, + Error, Result, +}; +use process_stream::Process; +use std::{ops::Deref, path::PathBuf}; +use tap::Pipe; +use xcodebuild::parser::BuildSettings; + +/// Simulator Device runner +pub struct Simulator { + device: Device, + info: BuildSettings, + config: BuildConfiguration, +} + +impl Deref for Simulator { + type Target = Device; + + fn deref(&self) -> &Self::Target { + &self.device + } +} + +impl Simulator { + pub fn new(device: Device, build_settings: BuildSettings, config: BuildConfiguration) -> Self { + Self { + device, + config, + info: build_settings, + } + } + + pub async fn boot<'a>(&self, logger: &mut Logger<'a>) -> Result<()> { + match pid::get_by_name("Simulator") { + Err(Error::NotFound(_, _)) => { + let msg = format!("[Simulator] Launching"); + tracing::info!("{msg}"); + logger.log(msg).await?; + tokio::process::Command::new("open") + .args(&["-a", "Simulator"]) + .spawn()? + .wait() + .await?; + let msg = format!("[Simulator] Connected"); + logger.log(msg).await?; + logger.log(fmt::separator()).await?; + } + Err(err) => { + let msg = err.to_string(); + tracing::error!("{msg}"); + logger.log(msg).await?; + } + _ => {} + } + + logger.log(self.booting_msg()).await?; + if let Err(e) = self.device.boot() { + let err: Error = e.into(); + let err_msg = err.to_string(); + if !err_msg.contains("current state Booted") { + logger.log(err_msg).await?; + logger.set_status_end(false, true).await?; + return Err(err); + } + } + Ok(()) + } + + pub async fn install<'a>(&self, logger: &mut Logger<'a>) -> Result<()> { + logger.log(self.installing_msg()).await?; + self.device + .install(&self.output_dir()) + .pipe(|res| self.ok_or_abort(res, logger)) + .await?; + Ok(()) + } + + pub async fn launch<'a>(&self, logger: &mut Logger<'a>) -> Result { + logger.log(self.launching_msg()).await?; + let mut process = Process::new("xcrun"); + + process.args(&[ + "simctl", + "launch", + "--terminate-running-process", + "--console", + ]); + process.arg(&self.device.udid); + process.arg(&self.info.product_bundle_identifier); + process.kill_on_drop(true); + + logger.log(self.connected_msg()).await?; + logger.log(fmt::separator()).await?; + + Ok(process) + } + + async fn ok_or_abort<'a, T>( + &self, + res: simctl::Result, + logger: &mut Logger<'a>, + ) -> Result<()> { + if let Err(e) = res { + let error: Error = e.into(); + logger.log(error.to_string()).await?; + logger.set_status_end(false, true).await?; + Err(error) + } else { + Ok(()) + } + } + + /// Get application identifier + pub fn app_id(&self) -> &String { + &self.info.product_bundle_identifier + } + + /// Get directory path to where the build output + pub fn output_dir(&self) -> &PathBuf { + &self.info.metal_library_output_dir + } + + /// Get a reference to the simulator's info. + #[must_use] + pub fn info(&self) -> &BuildSettings { + &self.info + } + + /// Get a reference to the simulator's config. + #[must_use] + pub fn config(&self) -> &BuildConfiguration { + &self.config + } +} + +impl Simulator { + fn booting_msg(&self) -> String { + format!("[{}] Booting {}", self.config.target, self.device.name) + } + + fn installing_msg(&self) -> String { + format!("[{}] Installing {}", self.config.target, self.app_id()) + } + + fn launching_msg(&self) -> String { + format!("[{}] Launching {}", self.config.target, self.app_id()) + } + + fn connected_msg(&self) -> String { + format!("[{}] Connected", self.config.target) + } +} diff --git a/src/runner.rs b/src/runner.rs deleted file mode 100644 index 450a611..0000000 --- a/src/runner.rs +++ /dev/null @@ -1,194 +0,0 @@ -mod simctl; - -use tokio::sync::MutexGuard; - -pub use self::simctl::*; - -use crate::{ - client::Client, - constants::DAEMON_STATE, - nvim::BufferDirection, - state::State, - types::Platform, - util::{fmt, pid}, - Error, Result, -}; -use { - process_stream::{Process, ProcessItem, StreamExt}, - tap::Pipe, - tokio::task::JoinHandle, - xcodebuild::parser::BuildSettings, -}; - -pub struct Runner { - pub client: Client, - pub target: String, - pub platform: Platform, - pub udid: Option, - pub direction: BufferDirection, - pub args: Vec, -} - -impl Runner { - pub async fn run<'a>( - self, - state: &'a MutexGuard<'_, State>, - settings: BuildSettings, - ) -> Result>> { - if self.platform.is_mac_os() { - return self.run_as_macos_app(state, settings).await; - } else { - return self.run_with_simctl(state, settings).await; - } - } -} - -/// MacOS Runner -impl Runner { - pub async fn run_as_macos_app<'a>( - self, - state: &'a MutexGuard<'_, State>, - settings: BuildSettings, - ) -> Result>> { - let nvim = self.client.nvim(state)?; - let ref mut logger = nvim.logger(); - - logger.log_title().await?; - logger.open_win().await?; - - tokio::spawn(async move { - let program = settings.path_to_output_binary()?; - let mut stream = Process::new(&program).stream()?; - - tracing::debug!("Running binary {program:?}"); - - use ProcessItem::*; - // NOTE: This is required so when neovim exist this should also exit - while let Some(update) = stream.next().await { - let state = DAEMON_STATE.clone(); - let state = state.lock().await; - let nvim = state.clients.get(&self.client.pid)?; - let mut logger = nvim.logger(); - - // NOTE: NSLog get directed to error by default which is odd - match update { - Output(msg) => logger.log(msg).await?, - Error(msg) => logger.log(format!("[Error] {msg}")).await?, - Exit(ref code) => { - let success = code == "0"; - let msg = fmt::as_section(if success { - format!("[Exit] {code}") - } else { - format!("[Error] Exit {code}") - }); - logger.log(msg).await?; - logger.set_status_end(success, true).await?; - } - } - } - Ok(()) - }) - .pipe(Ok) - } -} - -/// Simctl Runner -impl Runner { - pub async fn run_with_simctl<'a>( - self, - state: &'a MutexGuard<'_, State>, - settings: BuildSettings, - ) -> Result>> { - let Self { - client, - target, - udid, - .. - } = self; - - let ref mut logger = state.clients.get(&client.pid)?.logger(); - let app_id = settings.product_bundle_identifier; - let path_to_app = settings.metal_library_output_dir; - - logger.set_running().await?; - - let runner = { - let device = if let Some(udid) = udid { - state.devices.get(&udid).cloned() - } else { - None - } - .ok_or_else(|| Error::Run("udid not found!!".to_string()))?; - - let runner = SimDeviceRunner::new(device, target.clone(), app_id, path_to_app); - runner.boot(logger).await?; - runner.install(logger).await?; - runner - }; - - let mut launcher = runner.launch(logger).await?; - - match pid::get_by_name("Simulator") { - Err(Error::NotFound(_, _)) => { - let msg = format!("[Simulator] Launching"); - tracing::info!("{msg}"); - logger.log(msg).await?; - tokio::process::Command::new("open") - .args(&["-a", "Simulator"]) - .spawn()? - .wait() - .await?; - let msg = format!("[Simulator] Connected"); - logger.log(msg).await?; - } - Err(err) => { - let msg = err.to_string(); - tracing::error!("{msg}"); - logger.log(msg).await?; - } - _ => {} - }; - - logger.log(fmt::separator()).await?; - - let mut stream = launcher.stream()?; - - tokio::spawn(async move { - while let Some(output) = stream.next().await { - let state = DAEMON_STATE.clone(); - let state = state.lock().await; - let mut logger = match state.clients.get(&client.pid) { - Ok(nvim) => nvim.logger(), - Err(_) => { - tracing::info!("Nvim Instance closed, closing runner .."); - launcher.kill().await; - break; - } - }; - - use ProcessItem::*; - match output { - Output(msg) => { - if !msg.contains("ignoring singular matrix") { - logger.log(msg).await?; - } - } - Error(msg) => { - logger.log(format!("[Error] {msg}")).await?; - } - // TODO: this should be skipped when user re-run the app - Exit(code) => { - logger.log(format!("[Exit] {code}")).await?; - break; - } - }; - drop(state); - } - - drop(stream); - - Ok(()) - }) - .pipe(Ok) - } -} diff --git a/src/runner/simctl.rs b/src/runner/simctl.rs deleted file mode 100644 index 19a0582..0000000 --- a/src/runner/simctl.rs +++ /dev/null @@ -1,103 +0,0 @@ -use crate::{nvim::Logger, types::Device, Error, Result}; -use process_stream::Process; -use std::path::PathBuf; -use tap::Pipe; - -/// SimDevice ruuner -pub struct SimDeviceRunner { - device: Device, - target: String, - app_id: String, - path_to_app: PathBuf, -} - -impl SimDeviceRunner { - pub async fn boot<'a>(&self, logger: &mut Logger<'a>) -> Result<()> { - logger.log(self.booting_msg()).await?; - if let Err(e) = self.device.boot() { - let err: Error = e.into(); - let err_msg = err.to_string(); - if !err_msg.contains("current state Booted") { - logger.log(err_msg).await?; - logger.set_status_end(false, true).await?; - return Err(err); - } - } - Ok(()) - } - - pub async fn install<'a>(&self, logger: &mut Logger<'a>) -> Result<()> { - logger.log(self.installing_msg()).await?; - self.device - .install(&self.path_to_app) - .pipe(|res| self.ok_or_abort(res, logger)) - .await?; - Ok(()) - } - - pub async fn launch<'a>(&self, logger: &mut Logger<'a>) -> Result { - logger.log(self.launching_msg()).await?; - let mut process = Process::new("xcrun"); - - process.args(&[ - "simctl", - "launch", - "--terminate-running-process", - "--console", - ]); - process.arg(&self.device.udid); - process.arg(&self.app_id); - process.kill_on_drop(true); - - logger.log(self.connected_msg()).await?; - Ok(process) - } - - async fn ok_or_abort<'a, T>( - &self, - res: simctl::Result, - logger: &mut Logger<'a>, - ) -> Result<()> { - if let Err(e) = res { - let error: Error = e.into(); - logger.log(error.to_string()).await?; - logger.set_status_end(false, true).await?; - Err(error) - } else { - Ok(()) - } - } -} - -impl SimDeviceRunner { - fn booting_msg(&self) -> String { - format!("[Run:{}] Booting {}", self.target, self.device.name) - } - - fn installing_msg(&self) -> String { - format!("[Run:{}] Installing {}", self.target, self.app_id) - } - - fn launching_msg(&self) -> String { - format!("[Run:{}] Launching {}", self.target, self.app_id) - } - - fn connected_msg(&self) -> String { - format!("[Run:{}] Connected", self.target) - } -} - -impl SimDeviceRunner { - pub fn new(device: Device, target: String, app_id: String, path_to_app: PathBuf) -> Self { - tracing::debug!( - "SimDeviceRunner: {}: {app_id} [{path_to_app:?}]", - device.name - ); - Self { - device, - target, - app_id, - path_to_app, - } - } -} diff --git a/src/types/build.rs b/src/types/build.rs index aeded90..3b09fe4 100644 --- a/src/types/build.rs +++ b/src/types/build.rs @@ -39,8 +39,15 @@ impl Display for BuildConfiguration { } } +#[cfg(feature = "daemon")] impl BuildConfiguration { - pub fn as_args(&self) -> Vec { + pub fn args + std::fmt::Debug>( + &self, + root: P, + device: &Option, + ) -> crate::Result> { + use crate::xcode::append_build_root; + let mut args = self .to_string() .split_whitespace() @@ -49,7 +56,13 @@ impl BuildConfiguration { args.remove(0); args.insert(0, "build".to_string()); - args + + if let Some(device) = device { + args.extend(device.special_build_args()) + } + + // TODO: Customize root based on target and configuration + append_build_root(root, args) } } diff --git a/src/types/project/platform.rs b/src/types/project/platform.rs index 7d8a170..45ec7ec 100644 --- a/src/types/project/platform.rs +++ b/src/types/project/platform.rs @@ -1,6 +1,9 @@ use super::*; use std::str::FromStr; +#[cfg(feature = "daemon")] +use xcodebuild::parser::BuildSettings; + #[derive(Clone, Debug, Default, Deserialize, Serialize, Hash, PartialEq, Eq)] pub enum Platform { #[serde(rename = "iOS")] @@ -30,7 +33,8 @@ impl Platform { } #[cfg(feature = "daemon")] - pub fn from_display(display: &String) -> Result { + pub fn get_from_settings(settings: &BuildSettings) -> Result { + let display = &settings.platform_display_name; let value = if display.contains("Simulator") { display .split(" ") diff --git a/src/watcher/handle/target.rs b/src/watcher/handle/target.rs index 60b44d9..bffbe91 100644 --- a/src/watcher/handle/target.rs +++ b/src/watcher/handle/target.rs @@ -3,7 +3,7 @@ use crate::client::Client; use crate::constants::DAEMON_STATE; use crate::daemon::{WatchKind, WatchTarget}; use crate::types::BuildConfiguration; -use crate::xcode::{append_build_root, build_with_loggger}; +use crate::xcode::build_with_logger; use anyhow::Result; use notify::{event::ModifyKind, Event, EventKind}; use std::time::{Duration, SystemTime}; @@ -48,13 +48,14 @@ pub async fn create(req: WatchArguments) -> Result<(), WatchError> { match kind { WatchKind::Build => { - let ref args = append_build_root(root, config.as_args()) + let ref args = config + .args(root, &None) .map_err(|e| WatchError::stop(e.into()))?; let ref mut logger = nvim.logger(); logger.set_title(format!("Rebuild:{}", config.target)); - build_with_loggger(logger, &root, &args, true, true).await?; + build_with_logger(logger, &root, &args, true, true).await?; } WatchKind::Run => { diff --git a/src/xcode.rs b/src/xcode.rs index cfd03e4..176ac15 100644 --- a/src/xcode.rs +++ b/src/xcode.rs @@ -54,7 +54,7 @@ pub async fn fresh_build<'a, P: AsRef + 'a + Debug>( .pipe(Ok) } -pub async fn build_with_loggger<'a, P: AsRef>( +pub async fn build_with_logger<'a, P: AsRef>( logger: &mut Logger<'a>, root: P, args: &Vec,