diff --git a/rust/cargo_check.py b/rust/cargo_check.py new file mode 100644 index 0000000..d40ae00 --- /dev/null +++ b/rust/cargo_check.py @@ -0,0 +1,19 @@ +import toml +import subprocess as SP +import os + + +def set_version(rev=None): + with open("Cargo.toml") as fh: + cargo = toml.loads(fh.read()) + cargo["dependencies"]["pyo3"]["rev"] = rev + if rev is None: + del cargo["dependencies"]["pyo3"]["rev"] + with open("Cargo.toml", "w") as fh: + toml.dump(cargo, fh) + + +for commit in open("ch.txt").readlines(): + set_version(commit.strip()) + if os.system("cargo check") == 0: + break diff --git a/rust/ch.txt b/rust/ch.txt new file mode 100644 index 0000000..04fa4dd --- /dev/null +++ b/rust/ch.txt @@ -0,0 +1,2203 @@ +4f8c2e767 +3e905eb39 +a85d15711 +090204c2b +f2f0ccd9e +bbdca6b0b +1dc77d5a2 +90a2ec305 +f58398d6e +e73d696f8 +8a85feca9 +21d365f7d +7a7271319 +4317f16a9 +bd7869002 +f19e39ab4 +0f5a349fb +33617bfff +798d72e6a +bfe212b3d +15c40afe0 +75d44ca29 +207e177a2 +7501b16bc +d7a4c9428 +34a5e8c30 +bf6e5c45e +bbf1c39ce +eca93c3ff +e38a077c2 +cbe3e574b +d2c7645ba +bafe269dd +de9aae1e8 +eadd7b108 +4c55fa6b3 +eb7310562 +d674b5ff3 +be1b7045a +bcf48c0bd +468bb765b +7eb9afbac +5939362e7 +688021315 +75b2b62dd +69efb0980 +435536060 +febccbf6e +072be6ce8 +29c93c87c +89fe62eb8 +7fd35b2fb +01a74b254 +2813d2e6c +6f9048cd8 +c393d4ad9 +5c5527dfe +8e6398029 +3a2d563f3 +1e3a7f6f2 +91d0dbcea +da7a8fa2d +aa81e382b +45cb26d2f +837261c86 +bc3fac999 +465e83bb9 +2954342f6 +509db1177 +3b1f720eb +7e4d1c41e +956ed5241 +9f8b7cd9b +3e61a5801 +69dba08b0 +da22eecb5 +f769fed83 +5e7ce9558 +86af474a9 +0550db762 +8e8472143 +8ffe8c58b +dab8c2e4e +818ebf7dd +76c7f9eaa +f6ac9a021 +ab374b40d +69fb04f04 +d5eb8f054 +a5ebef4b2 +027c90c22 +8aeae6c8a +e3d9544ae +d3d68eafb +8f22d10a1 +7b5a07668 +bb571930f +8d282913b +b083e0bab +eb60a1c55 +11c1c5e6a +626268d28 +c8fb8fcc1 +9380bfde6 +040728875 +c4f36535d +9f1861034 +a19ed5051 +9a2d90834 +618de3060 +c4e68e628 +39b41b3dc +0f07cf8db +d32c3c0b3 +879b0b58a +6f74fe6b3 +78c51d359 +36ebd0566 +49d31a013 +e1533129c +e9bec070e +be09aa00a +b7ecec781 +75c807f31 +f2b347a9f +17cf97df7 +dfbe22bb5 +b6befcfb9 +816c50a64 +39bfb5f0d +8c6cbb605 +823b8e7f8 +e40f02201 +e6f8fa76a +746c352ca +e9e0da57a +3008528fa +dcab478d6 +a58a1cf4c +6ac1b0503 +378a6a484 +b3c937c73 +f36f19cea +ed63902ee +187d88956 +42e84ea6f +c8971552c +3253cc86a +d5b696f7a +ae8186523 +2cd466dc4 +97fd65859 +5e285fda7 +c2b173a14 +4af61e83c +7b1e8a6da +2da04e5b9 +9dc3f9dc1 +af553685f +5add8d1de +a73ff502b +fe57f6443 +53b63cddc +724a3fcc7 +956d499f5 +c83d88ba8 +1e8e6fd82 +5f2ec47be +d8effb24e +049202c01 +b73bb06ff +a9357ef8a +1b6d8be6b +8f41d56b9 +b5b8264eb +cffe7edf4 +5a68f749f +97f498795 +702411aef +184bafc31 +8d1678e28 +1aa4ae828 +810d3b62a +85de698a0 +e0c1f82b6 +1efe14256 +97aca504a +ac418ce02 +25eda3635 +6bc5207d4 +5331fc594 +b3566bc7d +d2c07a87d +a76bd7c4e +970e393bb +77b4b9e67 +9e2347622 +f3876a90b +c23447669 +d7fe7a92a +db543a09b +f10378f0c +5280a281c +139a1e6e6 +4a0c316b2 +dd240a6f0 +4796a13b7 +1c1d3c4dd +4759358ac +3b8af93ae +3b17ab052 +00a277c53 +1e39071c0 +9b5ea3f46 +d43a34986 +89e5a654a +fd739b587 +e9b15b83f +25b594cd4 +5a822bc98 +9f4ea2b23 +e58249cf5 +5e14b39c6 +6d16d0bbc +fcc5e609a +6dc44eb4e +73b40b145 +6998660ca +02ee7a5af +da4009507 +e02601332 +b7d5f9097 +77b1ae313 +a7a2ccb5f +4da5dbcd0 +e649e5867 +109997431 +88f0c7ec7 +fa2e22b9b +d4281a0cd +d69b815bb +e09873be3 +8480396a2 +40077245e +3f030d46f +a92ca0167 +701fb7f2b +9c3331e66 +433b812a6 +759dbeaed +107c0cf1b +a6765e388 +084b3621b +3a0cd8e40 +8eb0065e3 +ded83027f +f2f5877f0 +e67681d01 +1a8ebc230 +b7c4fdb9b +26fe29f0c +cea707dd1 +25069baef +74b22eb65 +96115eaaa +bbe4393b1 +e63e0cbf5 +c5a093d8d +6307c25b8 +311566718 +f470154cd +402c382f0 +09e36f255 +dc8e0c4c1 +ebb528d17 +6b78f1b43 +68cfd5e17 +4b9cb70c3 +7deb3b1fb +a12667be2 +39c299959 +fee755adb +ee0c178fe +ca6227c73 +399e4bf9b +24a3fbd4e +3ded0b2c5 +6568d78e2 +461b32a43 +dcac5ad20 +6a64806d9 +05159417a +ff1ae9832 +bab146a58 +6c652dff8 +18957159f +9bc41923b +68a3b1594 +0e3f7cbc3 +d3d61c6ad +c2a40fbf7 +043b13046 +3d0ee2a28 +90b14fb36 +aae57e704 +ca6cb99a4 +1f5cb83ef +4b746af11 +98d810e66 +daca04e5f +2fd218505 +8f8b42591 +45d892a97 +d5509424b +da4ed398b +0b5918e94 +7910dfc94 +00560a1cc +6b0f7d279 +6b4a4e881 +57f9dfd77 +41128bbfe +db0819be5 +4a5f219cc +3c02de268 +7b3de17d8 +c43fb9fcd +0eb4eb4e5 +1d33ac4e7 +a6fed34e2 +3176097a2 +de9698e7a +6c25f6aac +5d4e7374e +20c6c2d46 +50bb41f39 +cea8a9a2b +a2408cacb +6069ee123 +ba20b0ef2 +50de21abb +f8c8b8eff +58a0841ff +f8de335b0 +14980d742 +8fea23a0b +dfb7d7c58 +04f30c597 +d75f07281 +b88fe39ed +1beca86b1 +b60406110 +7531b9fb0 +5cbdef647 +99c601b6a +d1f28e908 +99a7856da +3c4809bf0 +4cb15ef67 +a8ec946fc +754642973 +11084e143 +d53697420 +c57e5f183 +541816b7d +fdf407e04 +8ed266225 +3d8b9a8e7 +43df3299a +d2174c2ea +4fe1841c5 +db6c822fa +99835f5ce +23d380ef0 +a55a48b18 +4b2f4b3a1 +56f68a55c +c5ae2dcdb +74f02119b +f45eaa00b +aff840636 +fd92a59a6 +90b88e1f9 +d04542fff +99eb25144 +cffefa4fa +0fcb19bfe +1996ac214 +cede793ce +a126f5d0a +26403a67d +ae0f8cf4e +68726f967 +6bd6633ef +6e216ffd6 +472fbf4fb +0a84c201f +3dc5b86f2 +fb17d5e82 +439efbb71 +302b3bb08 +95d045f73 +1f675dcaa +41e3b2507 +ea9824a98 +7b502821c +026caeda6 +c57177a16 +b3ca27dd1 +f7a4fbaa3 +451de182c +eca3bdc62 +ec79285fe +894e99998 +9e599af38 +3e62c3414 +a43824e6f +18440d7af +72e9abd4c +bf507da15 +ab0a731e5 +67a98d6c4 +f26e07cfd +b602b4bf6 +b04d0af39 +60edeb889 +7e591e310 +d22b03edd +18e565fab +6160cbfac +ff2aaea33 +8f8785d7c +766a520a1 +454c7f6ea +1d5cc89de +5c1cb34c4 +5a3f90374 +2ce8a0b8b +b7f3e5816 +3fae391a3 +3d463e163 +6f202efa5 +ea7a38499 +58590393c +2e3ece802 +ea5175693 +d5cff058e +acb1120c5 +e2dc843de +efa16a6dc +6b8440112 +8175d6f36 +c8cb3adc2 +b245e71c1 +0032508c3 +4b18830f1 +881cb0a5a +7702395b3 +15187674f +0b45135ff +b86de9376 +a6639076b +4aa2ff5e0 +d8a4ecb47 +4d7dfafe2 +bdb66afe0 +4b5fa7e97 +352707c29 +a676e6d5a +ac703f58a +2ba887a8c +95c2e2f58 +07611b035 +9ac66ac1e +9a3c47e3c +af8c0d253 +2915f50fc +064cd387e +c64848bd2 +3c1a975ec +42ee18011 +a85ed6ba8 +9893f5cc6 +935adaa5d +6c6d54db3 +c7016f8e4 +3881cc064 +5b8f43625 +dadeb17c3 +c0386f3d0 +8204bd08a +8b2b40c2a +b7b17edc1 +99f9b36b2 +3eff3ca50 +f0526eb73 +8550e0f57 +72debedc3 +b5157b043 +6dff93b7e +7977fe68e +fe229753f +14d2196ba +da1ab1b2b +59975f8dd +04dece480 +6868d7f73 +f8e07b2d3 +3b707c851 +4864c584f +30485f3f9 +defa43015 +34843d754 +caf4713b3 +bab05e813 +7a4909bdc +45eb9f4b8 +7aaef51ab +6a89a904e +69cbf1a49 +b0925e110 +ffe4e2f20 +8cdc0b42d +f6f607ef6 +69975339b +2713977ff +f55037c37 +3c898ee27 +85492842a +c7f3cde93 +e91d969e1 +179633561 +e57a98944 +65ad8a87f +c7a53611e +08bfec76a +d57f2423c +77f8cad65 +ee69ffd0f +91b323103 +e6ad49b6b +13ccdbee8 +f96595799 +4b1c48831 +5d19b9124 +25564e115 +9ff41fcd3 +681996da3 +89b7c7e30 +d019fe814 +d602b6534 +091284d44 +33bf37d3d +5397a62f4 +36318fc9b +fd3d47e03 +27105c941 +9b2fbbbe1 +a18c8ddf5 +094125cfe +f8573e7e1 +a6d38c992 +c38bf5ea7 +75516d87e +d97f003a0 +d860ee3f2 +c743c1843 +a34499952 +1c0ffdd44 +f1bb043b7 +ce4b3a56a +35851b7ff +b1ff620e4 +9facb20d8 +44f26f4bb +05a1a097a +a700e3d7c +fe9575a34 +e911828b7 +bd426d406 +46ba01982 +7745622b4 +a82726a24 +5eb7656a5 +aaa28a3bd +4bcc99427 +68c3208d3 +73947d84b +a3cde076f +88b0a03dc +a3e41cc81 +94f6248d8 +3228b4cd6 +305b774de +d3c5a61d7 +df44e500a +3d821b7f4 +c7e377a47 +96b71bfb7 +e70e9ab5e +a4c9fb96a +b04727c11 +30e82a301 +e820d55c6 +43a2fe6db +0774334b8 +39f151c3b +6b67f6dea +f15fa210f +f7ac0a288 +6b4a221d6 +f008c569a +0de22c665 +247c8b5f1 +1ed7460bf +0aa02f715 +8f57d9fb8 +5e0168b2e +7034332f4 +6ae27f9c4 +8e4204b50 +1cdd6020c +e752bd27f +e055fdb33 +d6f8514e1 +587401425 +d995701aa +be22d9e5b +5ab216dfe +1f85593d0 +21a040b8b +98b707918 +664209b3e +40c4b6a24 +5096f936d +38f25f646 +961add7f5 +c7e82b1f5 +6dabaf08b +41f31e85f +f3d1b0139 +83b92a6a5 +9d9ebfa55 +4586702fb +618b9090e +c6de61f7e +1e01f4f8c +ac28a3114 +382c79ec3 +eb34ce588 +149163e05 +3596cc65c +20534ec22 +a4ed4543d +741b7e3da +58e17be1a +cd2eefb65 +63fd354fe +1736568d2 +182b2fc61 +bd86b6750 +cf8f63cac +d90ac7640 +86cc84e69 +1332174e0 +6e807f852 +5ae014fe5 +7e4b7168a +3d77cb344 +afb960516 +f22708f14 +ad0a068a3 +f642f1916 +9c961b424 +370849e07 +67a7a6de6 +29b0a02fd +86cc424b2 +cc31c7dbf +faa21f48c +ceefa7cc2 +cc469afc3 +ec71dc63a +e633ae25e +ca07c4893 +59ed27787 +670b41c89 +2d879bc85 +7c687a8d3 +72339e5bf +a6438ebb1 +96a56fa9b +60cbe2f47 +7a83cb6af +383d0d3ba +721e74658 +fc5cdc103 +5d85ea7fd +83d0ac4e7 +9f827f024 +27f6abddb +c27d9947a +9669edbfe +c12836edc +f61171655 +a4cf09f16 +ab802cd82 +cba165746 +241a8956c +2fa017a50 +02d93346c +3e69389e6 +9073956da +503ec1a06 +f642dbccb +05b0cb66f +8dbb38837 +0f9a3b119 +787f5d305 +1d05de854 +c416e0ef8 +c66a95d35 +f2a7c6436 +45f23c08d +9c3b4b7d3 +dfd5a2abb +35f530167 +c76399e73 +ed2ec48a5 +e58ad7173 +99fdafbb8 +ed52d57c6 +0279b3d69 +7e6e4a923 +ab05a843b +3878bd7ac +faaf1777e +4d7ca3a45 +e4287e4e4 +4bf448eca +39d3ceb55 +9eda9e9f8 +a5a205969 +89ba9f52a +6a7090c0b +21a2f816f +134c129ed +eeeee236f +9525e58ed +f48295c7a +e7287bcf9 +b0bbe74ff +299d32537 +803f18e61 +d64ba9fa3 +c4c75bbf8 +ee10a02a2 +71b635e80 +cdabf9e1a +b289a75c1 +74600f5f0 +c68333c5c +d174c6ed2 +be10800ea +b5e23b4a3 +c6a5c054e +6dbcd3cdc +e966c1cd1 +5a63bdd96 +b5bf17f47 +cd1571976 +f005bbfbb +aeae195cb +a494d1784 +556e7ba02 +651e28ccb +caa5c7f88 +739efb1b5 +35168883b +1ebdb9f36 +0a5edcb74 +cf689840e +8399916ea +b9a2d2c89 +789c0b842 +f42ee0098 +c3fee87de +7e8616de3 +1d92c24db +e91290092 +60cd0d09c +5cc6b55c7 +661f47266 +e59f973ba +ffb66a33b +faa3feda3 +6d87934ce +7149a1fec +c7d6c48e6 +a7736dd51 +09bf9bbf4 +5a2b021fd +b2e01066f +515c7beac +f8bf25860 +fb8d3605d +f1b0288d3 +5858823e8 +77f0974da +f62f384ec +ff8a31a8e +da25a17b3 +821ce0e37 +95d8dda37 +c4c7997c7 +3dc4af052 +117f6eb47 +6d80ee067 +dc2fc80f4 +73e4ed723 +527da127f +f5c7b92c2 +afb82ee87 +60efd5b9c +edd2fba2d +85489ebd8 +a78465f8b +e6ca87d5d +51be6a60f +4e3d82818 +3f4f068c7 +569a7e9e9 +6673c440f +f5b471301 +4458c09fb +303dc2283 +00acbc461 +72003ec37 +ad9e67651 +08334fe58 +3ce8886ad +dfd1fa55c +2c82a0317 +3b7e83fb7 +d482b715d +dd2f1ba16 +9a9b519bc +9f2afbc3c +80179be2b +fdeef7d67 +2bb0d05a3 +bc7776e61 +7086141f8 +8acc5289c +176e0981c +3f27647b1 +b2561e9db +b2a5c705a +20481e832 +97189a16b +f75f742c5 +0d346458c +711155d7a +421b26bce +484ceb43e +7cdd25359 +3e475b052 +09883574e +5cc43b8d8 +59a9d4fd9 +d8dc3a17b +5a3466d1d +dd8e6211d +dc581fa74 +f79f84a31 +88924a312 +a56147fa5 +6540a374a +5a421fcdc +7564f7605 +6c5876624 +548f3f91c +438bd7f61 +310e59769 +a9e78b98d +b60b3395f +25f14d37a +ba5bc0f1e +21f2804c3 +3a6e0a272 +e2e4733b8 +d63fac8d1 +ae93e71a3 +f68ae0cfa +2db0612b6 +41ffe1ecd +f3fe0dfdd +c6a6634d8 +874d8a083 +0866dd898 +1ea59296a +0ec6603b7 +90bf482fa +2327882dc +dcce57f4f +498689423 +5b4d77db8 +86d239e44 +3067b7ba9 +d3743fec6 +6cd07c369 +ad590bd15 +0cd72ac21 +61e449b10 +32a15bc4a +625093ce5 +c52dae269 +d02f7c3aa +c1421e2e0 +8d9b4dd15 +f248aaddb +5a28a1c4f +b01592e20 +9ceb45382 +e1ffd6c35 +275e6cb7c +61194abf1 +2105fa896 +a7b526779 +6cb098ee1 +f9de1d03b +090b39265 +7a4cb50c9 +1a489d282 +94cb3e762 +ce659941e +37088024f +c13f0708a +1d1746353 +4c60af693 +a1f13c124 +c38b1bc7a +58ba920a9 +62d9b4027 +baaccfc77 +2de3146c6 +73c7f8a5c +8259cc5d8 +4a552a88c +f95f4e8c1 +c80134fbc +596c0c75b +7e914ac53 +1d3dd2c34 +01fc1405b +2a6679f6a +9f722ea9c +22687c371 +76e30b524 +638354cc3 +1a47aab36 +9e53418aa +f94688880 +853fc7c7d +328d61ca3 +c868cc3e4 +6f1123e6b +56f2257e9 +c71c116f2 +ae8a37cd0 +829f35af5 +e1154120d +9c3ac7e52 +0495ee52d +936f0153e +423b5d109 +d3bb75e4c +723232324 +8721f410e +9f5776f98 +bc770b9f3 +6e4c2b71e +80a6318b4 +ee4fc3b21 +fbe71b27c +3bb44629a +bb4848f2c +fd199e268 +6fd41a16a +df3629252 +20dbf542c +b132a0bfc +fbd012601 +27ef33703 +f9baa700d +262b708de +814584150 +8324e4579 +42557beb5 +053fa5b98 +8e4d23e47 +2bd5931a0 +1b4afd110 +d0e0f3a34 +56ad7d806 +2dc8813cf +5edd26337 +146cb31c5 +9e2347b81 +0deaee01a +27520cb68 +322594128 +b9f958075 +58a91a3be +bbfe79fa5 +419884c6b +c9d9e80ac +984751a57 +3452d6544 +89872dceb +6d7f32617 +26b88ca2f +22a89d07a +17535534e +51e7d55b4 +cbe668a0f +d00be67ad +32d6d4e99 +cf4cfe20f +a3c7cdfd9 +b8a6d67e3 +d18ebea1c +790a10375 +27b4c8a0b +a5de9dcf0 +15f5df457 +08e61694b +7a83c1dc0 +9102f2e36 +b8f1373be +2539acc1e +8d2fbd9e1 +ea6364b98 +de2108d71 +ece59c92f +13e7e3968 +9938eb937 +473635bd2 +2c75c42b6 +e3d528980 +119e0abde +949097874 +63ec65d5a +acbab2b3f +4c38b21e4 +be7784697 +25a5b74ba +f62ccfbe2 +9035d5403 +13d4d66fd +d618ca401 +f645720fe +9c8c5a606 +863ffb161 +195f5c30d +42f84ff88 +3de622cdf +287a168b1 +a73bd06c1 +5f175a41c +6222232c2 +6d442e596 +0890f2439 +19a9b7ef3 +42dbaeb91 +1081ba944 +d4f4f2f51 +3614f3815 +531f9db99 +faa5efc5a +3b01b8f6b +d1de3338d +34099b33f +cd23574d8 +6cec1c39c +aed046691 +57afb5160 +fb2349b6e +d2ba436d6 +c77049541 +90c3f746d +cadd0fb50 +9f45efeba +a9b05711b +4c0ddbe61 +ef68b2271 +bd6f923f4 +50c612960 +ecae8544f +9ae2f1f7f +be6d7b240 +52dfc0013 +9ffb2c617 +569db5fb0 +da0d6eeb5 +234e2c699 +264f642f1 +8b27f1e41 +dbaa2de06 +625a3f673 +607c23d28 +3b63cc917 +13302ea1c +74d955778 +21fe12d04 +56b82c2f7 +d598cf440 +b90d45d7e +38651a182 +4da911048 +39fa3dbbb +3e7a823de +92119d195 +eb6e7a2c2 +90dca39f0 +0859392d1 +3620aae50 +9ab63f228 +510067649 +71c584a11 +b5902af54 +d0f79fb9f +0ec24aa8d +7abd436a0 +f847974c0 +da906fb71 +38c6d942b +851d2207c +3a95d163c +8930bd00e +d42731a01 +0b1906b62 +78d3d11d1 +f12e299f1 +2fa3b942f +157fd7b2c +78207916d +980678450 +b869f0980 +a528c1e87 +106ba340f +ed2739829 +78a5053b2 +05874d3f1 +b850ca3e6 +c1cb5ca74 +28bc3cf1e +af68396c3 +868e28d5a +7047af287 +6a961298a +302c099a7 +0dc697fea +247da8d34 +6b362a465 +7ea875fc4 +c6d588877 +f9bca1aeb +2904291b9 +037236081 +f8adb456b +5ef95f9d0 +0bd5d9d4c +1ea5d209f +10ef6cd11 +9405ffa3b +d638a5197 +d92e52224 +372409504 +a525242b0 +ddc6313e7 +f3c98ca7b +4c1ff24b2 +e6569ae61 +29c882577 +f58549f1d +a5ab5661a +0101dc813 +a2af5fe71 +9b4d6cf51 +aa8be251d +8de0574aa +7293cdbc6 +3b8adeb48 +4847d5632 +6d9ee7fc3 +7c0379b13 +33e72a2b0 +47bbe8cc1 +b5e5bcf22 +3e7d5280c +0b6d47d17 +6202e2641 +c3986a724 +c3bcabc50 +265a6802d +c69634e0f +c7a967c34 +a09ffad32 +7053c897a +a05a78f7e +5d5689f95 +113de1bcd +078bea434 +b66ab7fab +26c539761 +cf3b1d2cc +a271ba9ed +3357fabb3 +003351ba6 +f68d0932f +bcc27bd52 +09ee50d4c +bcc42315f +94bd0d7b6 +b0f0a4428 +771d59b91 +9dd6bb0d2 +ced632b35 +12c20a75d +ee658de1f +7fc1dae23 +996c2baec +cd6f7295a +f701bccbd +ecf3aaafb +0b3945227 +08e7e0f55 +149a13cbf +cca8eb43d +d67d2c426 +f47697e2b +f5e078565 +c49bbe454 +7256bc85b +e8d6a4bcc +ee8594057 +8d781cb03 +f45362943 +d7b90c1b3 +52a64a924 +496b87952 +2b74cdbd5 +82129c70b +db4a2d901 +9cadbd11d +991a8b94d +b12b65cfa +7ebbbe41d +ff2871f32 +d2210f8a7 +d0ed68414 +55d091741 +b7dc0ad69 +fe8a719ee +83db76588 +d9d1650fc +27633da3b +a13b79459 +547fa3560 +5e1ce0125 +d8d17c332 +026b32e64 +d9e239942 +686d006be +2627fa8a0 +897716cf5 +59b7e0fc2 +ff70f4507 +3adcac6e6 +3248927db +7d4381fc5 +d59bebcc3 +dbd74401e +eb613c64d +2ffa302a8 +fe931a594 +c32dd1c12 +f6224ca0b +0df5527fb +4013d4089 +562d41751 +120158735 +bc412ede8 +68c14a570 +28d6c9986 +43eb5fa49 +1e31fc445 +6645708e4 +2f1e1a2a3 +4169b0317 +7d7c1ede4 +c22bec612 +9ce5e8cf2 +41f4d1d67 +70e1879d5 +3ec49b586 +aadde4cd0 +e374b5dd1 +fd6ab7392 +373d0cf5f +80096ae14 +f9ff7cd46 +130139426 +9394dc591 +f2be73c4f +785d33870 +9cb532131 +7a52bf647 +ce4c21752 +76510bdd0 +60d1565a8 +7fbe13d97 +54b09c704 +4fc52cf96 +66183d468 +0b964b503 +97688cb58 +d789eb658 +cf5423b5d +9ffbae30a +a87ddeab2 +2d57b3bef +727a05154 +6448a016b +b4be009e3 +c9db4f0da +d94054db3 +4795a3514 +a6b91a532 +6aeeebf5a +44b494c92 +a6b92c070 +40ad4b8b5 +051519d0f +7412eda4b +9544adaf1 +1b1121e55 +b3c92f2be +c42b71bc5 +314a4a2b3 +319afe1f7 +0b75334b7 +8ba801cca +19ba97296 +63441a4b9 +01b7b3fee +31ff8356b +8e4e446e3 +2607fe9fd +37eff4430 +df89720e2 +580e50f72 +758d30abb +269ddbdd5 +d5efc4044 +d1ec82d4a +ecadcef0c +4414d684e +d1d0dddb4 +d07c53877 +bf550c3c1 +b43b48198 +103bde7db +a6944b648 +46b9bd6a9 +5717463da +416a7fd8d +d445d60e0 +cb5bae2c9 +8c2602001 +da3e9a90e +5dd7ae6ce +858a12437 +afcc87e82 +0b511e868 +8783d61c0 +5a26fa495 +3b6a87c8c +70bdf5e93 +9dc76610b +3e8a36b29 +57048bc5f +15204bab5 +7f49673fa +cc352dade +b64977fa8 +b80b85539 +355424861 +80b3ce780 +57de066a6 +87e3f5d60 +4dccd556b +0963a6052 +f12af1653 +aed4af9a1 +79491db60 +2a618698c +0880ac166 +2fcac8500 +cb6c287f1 +29fdc05b6 +5a8f5034d +e3b74498c +4735c2c51 +d0c42dfcc +2ee1102ef +611342874 +7f6883587 +1c276105e +1c0eac269 +ccbc73a38 +45bb09b3e +ced4eb532 +e570c6b9b +14ab12b89 +cab682d85 +6b665e9a8 +a5d0b3022 +0982cba18 +6719e152b +e66c5ebb8 +2aedbffcd +80502bd30 +24eee4612 +5dc5c534d +5198fccae +ffee21cb1 +5cc6dc74d +6c25a753b +4585f990b +7278f4275 +d3a762ea9 +884450277 +a923f8b5d +2c0a86602 +11e2163bb +25514f69d +e58cd1c58 +d00abc1fa +524fdeeea +995ec109c +e585f5881 +057660e54 +cce9d0de5 +d50d1fb7e +5b9696945 +0b9557a24 +b7a8d2533 +438f4bf09 +4eb22a3c2 +c4939ab9d +f8d914cac +473b1f8b3 +a59e1dc8a +30baa990f +0874c243e +a5d3ed093 +9fe78b5cb +f8e503f3b +b4f727347 +ffb5880fa +81fd4bd24 +8b7a57891 +4f3e5ba35 +63a2066a3 +96ad2efdd +c39a1d7e9 +3681cf51e +b738c1a04 +324a6b269 +35e91a5cd +d6035bce1 +8f2a705cd +8ee8562a7 +81f31153a +cd17b41b8 +4bc079f61 +4b26edfa0 +9a141fb92 +050397b72 +017c404d6 +1f6c73e91 +3cb57f557 +70b07f811 +653f081d6 +6a31a4cbb +a57ebc792 +258e84c4e +99d5994d9 +d3832359a +e7a7b3d5a +e5bf656cb +d02a950eb +9d56fd279 +b5ffefc50 +eb9050ab9 +68937db20 +ff2780cb8 +086a28e23 +25e2080a7 +95d94c19b +8975ce508 +826544d70 +fa69b1f99 +e5780ed2b +703883687 +9da124748 +70c7b4a2a +ac27eb8b6 +c19a75645 +14db4227c +e186b5d2b +0abc39ef4 +25472e542 +b92056b42 +03b6e5c12 +bf793b4b7 +ed8599cfd +3b0014504 +59d9f9e45 +1ad8ad102 +268d7fd3d +11f244692 +a61c5e56a +21939c4d8 +85baa8bfc +16297a991 +19d20471c +130c33ec0 +590edad93 +06a0b0514 +cd6558a19 +032f2e0b3 +b3cc6f1e6 +5537ece07 +85eced19d +e65238300 +b7f3231ec +44da09a0f +e44365bec +5dad22e3d +95915b55d +c44e23f4b +6a545f4ab +325070f6c +d78692017 +0e2afb7b8 +60f6a7321 +aa5b4af1d +afcfed492 +665a1da01 +dcaa3130d +ebcd4f5a3 +181e38b55 +d56781703 +8227ce81e +7631f0a6c +67ce4e451 +2908b0122 +268fe2a43 +139a31b1e +e5c1fcf11 +fc3ab84bf +efba0742e +a4fd878cb +a20230e73 +e45eb6e87 +3b6d784bf +823054052 +b250ad22c +c5d086099 +68e197993 +c9572d6e1 +a120bbf15 +43a5d6f1b +86252cda4 +65a42a2b1 +3ab5e4526 +ce15dda5b +4b0a8f501 +7b5fc4b65 +3e5fadf37 +78b826e11 +01ab0f828 +5a386ebb4 +60b49d15c +a7b3abff6 +9aa05daf0 +05e847f66 +4b254a72f +e31557dd3 +ba86596be +1834ec4a3 +54a87aacd +40d34ca59 +fcb20c6f2 +eed2cb730 +da2db1eb2 +98bdf63a4 +2ee641946 +5f1a410d6 +0756e341a +a00ae1757 +97c6b7591 +e23c7247e +1035aaae4 +13820f4ce +f344c4ce3 +9cecfc0ec +63baa575a +5559dbb9e +c6067b90c +01d688fc9 +69963d75e +fc1df289b +dd29dbce8 +512bd6a33 +39a78aa40 +ae40a3024 +5a8fd2feb +e69163344 +6bbf3d759 +2d06b0771 +149aa3a0e +292bd2c13 +4daac5078 +c5f5620f7 +fb8b32072 +8eb5dc066 +52ade64bf +ed31492d3 +27f8747ba +49de1f1d4 +ce05cb91c +c1c4648ad +a90d8c241 +3028dcf58 +6b093af3d +afe2324ec +f494f0c3d +379f178df +b36e75e30 +800fa231b +8bc1195f1 +51544b864 +a00e23a59 +503e4221c +082db89aa +2d217be34 +3a2004eab +4e836cb22 +378fae965 +a5e3429d6 +0ba541e76 +84ebdbcfe +33ab9829f +d80eee6fb +352774744 +64f120a8f +14c6aaad5 +8238a141a +f0ece6dfd +3e3fed9c1 +b1e6f0706 +e5b99ae2c +7076a57fe +cc56ded6b +648224503 +289e5e0a2 +736ad15ae +61f85c730 +006e38cd6 +a58aa7b5e +2faf18bb9 +00bd5615e +cb969161c +b9377849c +c48386aff +397f50571 +af663e0f8 +7cf8e1ab8 +96788bf19 +e9341d6f0 +08ddb3f14 +bc0f9b014 +ce53e8230 +c4ba2b0f2 +40efa5c95 +7b5521fdb +b4deb673c +d4a5a4633 +55ece55b3 +005c36548 +93b1dd826 +75d6684d2 +a993d8d7e +32e25c8bf +213f9a638 +746609778 +f68103813 +c0263f7bd +61138f988 +b0f25f8e4 +60a965edc +818fc4b12 +e85db971f +f4d0fe395 +edc9fc1b7 +1008dafea +d15e85800 +0679fec85 +51115e70f +fd1088f94 +ac0594a5b +77c09dc09 +3bed79fe0 +5bf6ce386 +bd7a0feb8 +b8b9daf67 +b54eb12c5 +d9bd48507 +293569b6a +b67954fd1 +fdf971c54 +706477f13 +319ee30c7 +d6979c855 +7379766ea +d7c3d3419 +4d68f7f2a +6204a06cb +b8559519c +acc00b773 +2fdbcd356 +a517b994c +52df3a432 +26fccf602 +f07e56225 +b21ded3aa +8d4e0204f +d619ded98 +fdd9ac7ae +03ced8917 +805429e0f +05d4a0a9a +3b4d14721 +6b18ccb50 +cb68cd23a +8188c9533 +c28a619ef +5a44ccb40 +cfb2b1628 +ea8f11fa6 +86c20bb13 +9e08d3eec +6204de4a6 +a90c763bc +e12e98a7c +b3079f759 +a584ce12e +84f557899 +a448aa54c +57cc139c8 +b75160daf +27bd365f5 +cbfdfa2d0 +fc762288f +9176dc4df +bcaaeb852 +6834a18a5 +4cdb77335 +2f3ea202b +0b47d4456 +92bf7b9c0 +a3e611709 +48106e81c +861bee7a0 +5d25c7dee +3040ac12b +b8913a370 +3b90c569f +2b4eba1fc +b84474155 +5e00e1321 +ec7381084 +8a34e657a +86a8dfec0 +61b8bd069 +4232caf3a +ad3868837 +51ac8c9c7 +ea8ccf190 +55d0d5873 +969cba2c1 +6c87c9b77 +bfb01f65d +6205be98b +467cce6c6 +52bcc11cd +1df2c931e +d165dbe4d +48329a793 +0979653b9 +f3176dacf +912b9d2cb +881e0e333 +747fd8a6f +b350e1cfb +5fdad40ca +579c1280e +a29f5e83c +d6fb90bdc +56d93249a +8f62197f0 +9abc69f5c +f0120749f +5686a8110 +c9717249a +3303af9b2 +4c802d901 +3401683eb +c7c7b8bec +8fd6e3216 +edc7a45d6 +63c70da9a +3035ab280 +629f53ac5 +452a4e8d7 +1f2c927bd +201289d6c +eb64aa11a +266e608dc +0c7293125 +5119fa4f1 +1ff47d49c +7a4a736d9 +93c3d9ceb +8b3c28045 +04168ab86 +9759cf717 +7a75d3e65 +2eea45e9f +c9aefd7e5 +34e4d956f +086f24e7a +521a91fbc +9b1c4c55f +6d40d651a +78d7d99bd +d8fff8e91 +d45c0a36c +5427a33c7 +f4feade48 +088d44f8d +a24c2f04f +24f5c3f5e +3e20979f3 +9eae1523c +0e777f1f4 +b2d49c364 +03a381787 +bf4e36d9d +e40ef289e +a95de027c +13ac12a56 +1de56bde7 +45361c3fc +8a295793a +3bb7a64db +ef5bd982b +da310715f +c86a5ff4a +762708d4d +e128fa822 +a3823cec8 +98e66ee32 +ac1a3acaa +c9904f045 +c4e3be677 +83632604a +a65f9e03f +257be7119 +8d728663d +f651b442b +665921e84 +8ccb749c1 +ffe774a8c +d7ce1c0af +364d7af69 +23c36f571 +9bb6ec20a +582b9e4e0 +4b6b82037 +4bbea0330 +508937bad +b6939f158 +362fe7329 +ca7280fde +e638b2654 +d7a94ba4b +a6e1133ac +32e0d3560 +f5130e51e +654f86cf5 +e7abe40cd +1cf4f275e +278ce8591 +d615c319f +9707c5ab7 +3b0ec638b +ca4203e4d +e3d6ac2ca +3152ef22f +af8131f85 +a48d74c62 +fbe1a07d1 +06cab0a92 +cb4ee822e +97727b2b2 +acd36360d +623056d3c +3af2e3a9f +b7090799b +b83a5d9ba +e2d778143 +62a083e38 +4cb29c14f +f6ed2bbae +278c1aece +2c89f6264 +2b012968e +52c05c6ba +e644f24a2 +35917e967 +39e73b80d +b34d81541 +d2b953340 +b10523b48 +be884bfe7 +112913150 +227c0a6e4 +ca6bd439a +d054115d8 +2db59a083 +2e8d343b0 +72e1e0583 +291e08e29 +305bc4324 +7c59d554e +d77f93056 +d7446cf38 +022217683 +1a6e26f3c +597893c62 +453c43203 +d26809122 +4535827f8 +04081bc8d +9eafaebfa +5886720c9 +806f212dc +20c2dcdba +3de859373 +713a5c53d +318d9a9ef +78f673893 +d21143fa3 +c06838a38 +933e0ed11 +3d99a4ac3 +9ab3e9ea4 +be0c1573a +b37fa220d +d68e66432 +d826377d4 +044556024 +9aec3f33f +fffcf5783 +a14e3d2b7 +79707c03d +fb5e4a152 +b721868c2 +14bd89dec +4a01ed31f +cd88d2897 +2e977a9c2 +271a44475 +cdf2dc8ff +3826b54a3 +f89f957dd +80a4ad146 +867666cb2 +e608d5eab +b43fa55e0 +337a90c2f +0bd9e3ebd +cc81a0107 +ab83b4f4a +309182cfe +547879ef0 +9b278ba56 +3af6e1784 +be682d848 +162e20d9e +96ee65273 +061e46bde +acc571253 +506443210 +d70562050 +ad7f43efc +7c9065115 +53353d374 +a1654d5d6 +a4f946096 +067f26287 +ba325b10d +5223cf473 +e5f77018f +d22fbb31c +c01a1e830 +b617af7c5 +249be0da3 +1633e2412 +109c704ad +8c398a66c +7092bd436 +54aa17abf +7269dc64c +67282d2e2 +bab907b0b +168a060f4 +e8a69d943 +049bcb327 +a133bc5c3 +4f6e67449 +669cc5627 +56eb23ccb +a19b186bb +e935111c9 +c1682b68a +32086a0ef +0a270a058 +44611991c +d33a4b68f +2b7d28f7f +5bab92cbc +080ca1762 +b21a23b30 +6c0e7e07c +65395a11b +93b522404 +cb938e190 +a0cda1a66 +d87a4596e +d00d59959 +65967c240 +dbcdbedc5 +809e9ab22 +f90d42745 +a63aa4353 +636cfee28 +ff69760b9 +160b23eff +173a6147f +86a3d605e +3e2dca717 +fa5c866cd +6316ddc28 +814a2ac72 +93645484e +a23b5b591 +376ce21f2 +072f4d24e +74cdb841c +5d16c62cd +85b5de71f +a785ba87a +a884ee945 +63d5f2cd1 +45d03bf8b +1ad27b977 +aac888b1b +1c4d71d71 +a469635ec +2cfe52215 +144d14f8c +f6718a271 +d495eaaa4 +dd93257bd +04ea39d26 +79abfb99e +a0d867026 +29693eec1 +dae7c891d +43552a075 +2904330b1 +cdca6f04e +76e38e1a5 +00492e700 +9f2244bbc +3b02ef5b9 +6b496b477 +1423162ad +280cdab7a +e6b5312c8 +a2eb6de52 +5414cfb89 +4980053e9 +5c74f5586 +6e1fc3517 +ba0643c11 +7c9b96ee9 +fa32b5239 +cc2d30db5 +1daf64b0e +387ca4b2d +981928a2f +2459d8f0c +34ac5845b +6a1985a21 +cabcc217b +73e4ce3f8 +e84818969 +6b7b47d2a +dd771a145 +92a30e2c3 +e237bdd57 +838793279 +124a85d74 +0b712d067 +7931e8f1f +8c8779e3f +db4745590 +d70479d25 +a106cabc4 +38b5971e5 +b1eca56ec +d4bdcc5cb +6a0f951e9 +db8edd7f4 +461255f3f +427cdf09f +b3e20e900 +bb13ecd61 +6a4122796 +6661524a7 +c1acf04e0 +b9b67ee93 +bab321459 +b2293e593 +6b5da09e7 +5594db826 +888967ab5 +84386d826 +73c900edb +818acb4d7 +81a8cbb64 +c07b0468e +a60037e27 +f527c237f +b3fe39c3c +fbd60f11f +1e5605036 +5d3d03bca +5a303789b +f8e24a870 +60360fa03 +2a91b00ab +dd20e00c7 +913f3ea2e +77b178af4 +f423acee6 +5566faf23 +55ea6cc85 +284f7a793 +6d9fd93df +d8a1fcd86 +706d7c1b7 +fd2ae9ce6 +b3be3d35d +1c7eb2340 +038dfc747 +540f93412 +c61e1e51f +eca5b4039 +df14c894b +61acf98ae +335913e27 +60d07011a +5569ae3bb +d247b138c +7ccf5c88f diff --git a/rust/rustup_check.py b/rust/rustup_check.py new file mode 100644 index 0000000..885c1f6 --- /dev/null +++ b/rust/rustup_check.py @@ -0,0 +1,19 @@ +import subprocess as SP +import os +from datetime import timedelta +from datetime import datetime + +dt = timedelta(days=1) +d = datetime.today().date() + +while True: + toolchain="nightly-{}".format(d.isoformat()) + ret = os.system( + f"rustup default {toolchain}" + ) + if ret==0: + os.system("cargo +{} clean".format(toolchain)) + if os.system("cargo +{} check".format(toolchain))==0: + print(d) + break + d = d - dt diff --git a/rust/src/data.json b/rust/src/data.json new file mode 100644 index 0000000..3d3e655 --- /dev/null +++ b/rust/src/data.json @@ -0,0 +1,289 @@ +{ + "timestamp": "2019-09-25T21:29:51Z", + "event": "Loadout", + "Ship": "asp", + "ShipID": 0, + "ShipName": "Nightmaregreen_N", + "ShipIdent": "NMGR_N", + "HullValue": 6144793, + "ModulesValue": 33042643, + "HullHealth": 1.000000, + "UnladenMass": 347.200012, + "CargoCapacity": 0, + "MaxJumpRange": 56.372398, + "FuelCapacity": { + "Main": 64.000000, + "Reserve": 0.630000 + }, + "Rebuy": 1959374, + "Modules": [ + { + "Slot": "ShipCockpit", + "Item": "asp_cockpit", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "CargoHatch", + "Item": "modularcargobaydoor", + "On": true, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "TinyHardpoint1", + "Item": "hpt_heatsinklauncher_turret_tiny", + "On": true, + "Priority": 0, + "AmmoInClip": 1, + "AmmoInHopper": 2, + "Health": 1.000000 + }, + { + "Slot": "TinyHardpoint2", + "Item": "hpt_heatsinklauncher_turret_tiny", + "On": true, + "Priority": 0, + "AmmoInClip": 1, + "AmmoInHopper": 2, + "Health": 1.000000 + }, + { + "Slot": "TinyHardpoint3", + "Item": "hpt_heatsinklauncher_turret_tiny", + "On": true, + "Priority": 0, + "AmmoInClip": 1, + "AmmoInHopper": 2, + "Health": 1.000000 + }, + { + "Slot": "TinyHardpoint4", + "Item": "hpt_heatsinklauncher_turret_tiny", + "On": true, + "Priority": 0, + "AmmoInClip": 1, + "AmmoInHopper": 2, + "Health": 1.000000 + }, + { + "Slot": "PaintJob", + "Item": "paintjob_asp_operator_red", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "Armour", + "Item": "asp_armour_grade1", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "PowerPlant", + "Item": "int_powerplant_size5_class2", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "MainEngines", + "Item": "int_engine_size4_class2", + "On": true, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "FrameShiftDrive", + "Item": "int_hyperdrive_size5_class5", + "On": true, + "Priority": 0, + "Health": 1.000000, + "Engineering": { + "Engineer": "Felicity Farseer", + "EngineerID": 300100, + "BlueprintID": 128673694, + "BlueprintName": "FSD_LongRange", + "Level": 5, + "Quality": 1.000000, + "ExperimentalEffect": "special_fsd_heavy", + "ExperimentalEffect_Localised": "Mass Manager", + "Modifiers": [ + { + "Label": "Mass", + "Value": 26.000000, + "OriginalValue": 20.000000, + "LessIsGood": 1 + }, + { + "Label": "Integrity", + "Value": 93.840004, + "OriginalValue": 120.000000, + "LessIsGood": 0 + }, + { + "Label": "PowerDraw", + "Value": 0.690000, + "OriginalValue": 0.600000, + "LessIsGood": 1 + }, + { + "Label": "FSDOptimalMass", + "Value": 1692.599976, + "OriginalValue": 1050.000000, + "LessIsGood": 0 + } + ] + } + }, + { + "Slot": "LifeSupport", + "Item": "int_lifesupport_size4_class2", + "On": true, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "PowerDistributor", + "Item": "int_powerdistributor_size4_class2", + "On": true, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "Radar", + "Item": "int_sensors_size5_class2", + "On": true, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "FuelTank", + "Item": "int_fueltank_size5_class3", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "Decal1", + "Item": "decal_explorer_starblazer", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "Decal2", + "Item": "decal_explorer_starblazer", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "Decal3", + "Item": "decal_explorer_starblazer", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "ShipName0", + "Item": "nameplate_shipname_white", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "ShipName1", + "Item": "nameplate_shipname_white", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "ShipID0", + "Item": "nameplate_shipid_white", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "ShipID1", + "Item": "nameplate_shipid_white", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "Slot01_Size6", + "Item": "int_fuelscoop_size6_class5", + "On": true, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "Slot02_Size5", + "Item": "int_fueltank_size5_class3", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "Slot03_Size3", + "Item": "int_repairer_size3_class5", + "On": false, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "Slot04_Size3", + "Item": "int_shieldgenerator_size3_class2", + "On": true, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "Slot05_Size3", + "Item": "int_buggybay_size2_class2", + "On": true, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "Slot06_Size2", + "Item": "int_detailedsurfacescanner_tiny", + "On": true, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "Slot07_Size2", + "Item": "int_dockingcomputer_standard", + "On": true, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "Slot08_Size1", + "Item": "int_supercruiseassist", + "On": true, + "Priority": 0, + "Health": 1.000000 + }, + { + "Slot": "PlanetaryApproachSuite", + "Item": "int_planetapproachsuite", + "On": true, + "Priority": 1, + "Health": 1.000000 + }, + { + "Slot": "VesselVoice", + "Item": "voicepack_eden", + "On": true, + "Priority": 1, + "Health": 1.000000 + } + ] +} diff --git a/rust/src/data_guardian.json b/rust/src/data_guardian.json new file mode 100644 index 0000000..530bcc9 --- /dev/null +++ b/rust/src/data_guardian.json @@ -0,0 +1,193 @@ +{ + "timestamp": "2019-09-25T21:29:51Z", + "event": "Loadout", + "Ship": "asp", + "ShipName": "Nightmaregreen_G", + "ShipIdent": "NMGR_G", + "HullValue": 6144793, + "ModulesValue": 33181682, + "UnladenMass": 348.500061, + "CargoCapacity": 0, + "MaxJumpRange": 60.164637, + "FuelCapacity": { + "Main": 64, + "Reserve": 0.63 + }, + "Rebuy": 1966323, + "Modules": [ + { + "Slot": "CargoHatch", + "Item": "modularcargobaydoor", + "On": true, + "Priority": 0 + }, + { + "Slot": "TinyHardpoint1", + "Item": "hpt_heatsinklauncher_turret_tiny", + "On": true, + "Priority": 0, + "Value": 3071 + }, + { + "Slot": "TinyHardpoint2", + "Item": "hpt_heatsinklauncher_turret_tiny", + "On": true, + "Priority": 0, + "Value": 3071 + }, + { + "Slot": "TinyHardpoint3", + "Item": "hpt_heatsinklauncher_turret_tiny", + "On": true, + "Priority": 0, + "Value": 3071 + }, + { + "Slot": "TinyHardpoint4", + "Item": "hpt_heatsinklauncher_turret_tiny", + "On": true, + "Priority": 0, + "Value": 3071 + }, + { + "Slot": "Armour", + "Item": "asp_armour_grade1", + "On": true, + "Priority": 1, + "Value": 0 + }, + { + "Slot": "PowerPlant", + "Item": "int_powerplant_size5_class2", + "On": true, + "Priority": 1, + "Value": 140523 + }, + { + "Slot": "MainEngines", + "Item": "int_engine_size4_class2", + "On": true, + "Priority": 0, + "Value": 52325 + }, + { + "Slot": "FrameShiftDrive", + "Item": "int_hyperdrive_size5_class5", + "On": true, + "Priority": 0, + "Value": 4478716, + "Engineering": { + "BlueprintName": "FSD_LongRange", + "Level": 5, + "Quality": 1, + "ExperimentalEffect": "special_fsd_heavy", + "Modifiers": [ + { + "Label": "Mass", + "Value": 26.000061, + "OriginalValue": 20 + }, + { + "Label": "Integrity", + "Value": 93.839832, + "OriginalValue": 120 + }, + { + "Label": "PowerDraw", + "Value": 0.690001, + "OriginalValue": 0.6 + }, + { + "Label": "FSDOptimalMass", + "Value": 1692.58667, + "OriginalValue": 1050 + } + ] + } + }, + { + "Slot": "LifeSupport", + "Item": "int_lifesupport_size4_class2", + "On": true, + "Priority": 0, + "Value": 24895 + }, + { + "Slot": "PowerDistributor", + "Item": "int_powerdistributor_size4_class2", + "On": true, + "Priority": 0, + "Value": 24895 + }, + { + "Slot": "Radar", + "Item": "int_sensors_size5_class2", + "On": true, + "Priority": 0, + "Value": 69709 + }, + { + "Slot": "FuelTank", + "Item": "int_fueltank_size5_class3", + "On": true, + "Priority": 1, + "Value": 85776 + }, + { + "Slot": "Slot01_Size6", + "Item": "int_fuelscoop_size6_class5", + "On": true, + "Priority": 0, + "Value": 25240068 + }, + { + "Slot": "Slot02_Size5", + "Item": "int_fueltank_size5_class3", + "On": true, + "Priority": 1, + "Value": 85776 + }, + { + "Slot": "Slot03_Size3", + "Item": "int_repairer_size3_class5", + "On": false, + "Priority": 0, + "Value": 2302911 + }, + { + "Slot": "Slot04_Size3", + "Item": "int_shieldgenerator_size3_class2", + "On": true, + "Priority": 0, + "Value": 16506 + }, + { + "Slot": "Slot05_Size3", + "Item": "int_buggybay_size2_class2", + "On": true, + "Priority": 0, + "Value": 18954 + }, + { + "Slot": "Slot06_Size2", + "Item": "int_detailedsurfacescanner_tiny", + "On": true, + "Priority": 0, + "Value": 219375 + }, + { + "Slot": "Slot07_Size2", + "Item": "int_dockingcomputer_standard", + "On": true, + "Priority": 0, + "Value": 3949 + }, + { + "Slot": "Slot08_Size1", + "Item": "int_guardianfsdbooster_size1", + "On": true, + "Priority": 0, + "Value": 405020 + } + ] +} \ No newline at end of file diff --git a/rust/src/edsm.rs b/rust/src/edsm.rs new file mode 100644 index 0000000..98c3bcd --- /dev/null +++ b/rust/src/edsm.rs @@ -0,0 +1,196 @@ +use crate::common::get_mult; +use crate::common::SystemSerde; +use fnv::FnvHashMap; +use pyo3::prelude::*; +use serde::Deserialize; +use serde_json::Result; +use std::fs::File; +use std::io::Seek; +use std::io::{BufRead, BufReader, BufWriter, SeekFrom}; +use std::path::PathBuf; +use std::str; +use std::time::Instant; + +#[derive(Debug, Deserialize)] +#[allow(non_snake_case)] +struct Body { + name: String, + subType: String, + #[serde(rename = "type")] + body_type: String, + systemId: i32, + systemId64: i64, + #[serde(rename = "distanceToArrival")] + distance: f32, +} + +#[derive(Debug, Deserialize)] +struct Coords { + x: f32, + y: f32, + z: f32, +} + +#[derive(Debug, Deserialize)] +struct System { + id: i32, + id64: i64, + name: String, + coords: Coords, +} + +#[derive(Debug)] +pub struct PreprocessState { + pub file: String, + pub message: String, + pub total: u64, + pub done: u64, + pub count: usize, +} + +fn process( + path: &PathBuf, + func: &mut dyn for<'r> FnMut(&'r str) -> (), + callback: &dyn Fn(&PreprocessState) -> PyResult, +) -> std::io::Result<()> { + let mut buffer = String::new(); + let fh = File::open(path)?; + let total_size = fh.metadata()?.len(); + let mut t_last = Instant::now(); + let mut reader = BufReader::new(fh); + let mut state = PreprocessState { + file: path.to_str().unwrap().to_owned(), + total: total_size, + done: 0, + count: 0, + message: format!("Processing {} ...", path.to_str().unwrap()), + }; + println!("Loading {} ...", path.to_str().unwrap()); + while let Ok(n) = reader.read_line(&mut buffer) { + if n == 0 { + break; + } + buffer = buffer.trim_end().trim_end_matches(|c| c == ',').to_string(); + if !buffer.is_empty() { + func(&buffer); + } + let pos = reader.seek(SeekFrom::Current(0)).unwrap(); + state.done = pos; + state.count += 1; + if t_last.elapsed().as_millis() > 100 { + callback(&state)?; + t_last = Instant::now(); + } + buffer.clear(); + } + Ok(()) +} + +fn process_systems( + path: &PathBuf, + callback: &dyn Fn(&PreprocessState) -> PyResult, +) -> FnvHashMap { + let mut ret = FnvHashMap::default(); + process( + path, + &mut |line| { + let sys_res: Result = serde_json::from_str(&line); + if let Ok(sys) = sys_res { + ret.insert(sys.id, sys); + } else { + eprintln!("\nError parsing: {}\n\t{:?}\n", line, sys_res.unwrap_err()); + } + }, + callback, + ) + .unwrap(); + ret +} + +pub fn build_index(path: &PathBuf) -> std::io::Result<()> { + let mut wtr = BufWriter::new(File::create(path.with_extension("idx"))?); + let mut idx: Vec = Vec::new(); + let mut records = (csv::Reader::from_path(path)?).into_deserialize::(); + loop { + idx.push(records.reader().position().byte()); + if records.next().is_none() { + break; + } + } + bincode::serialize_into(&mut wtr, &idx).unwrap(); + Ok(()) +} + +fn process_bodies( + path: &PathBuf, + out_path: &PathBuf, + systems: &mut FnvHashMap, + callback: &dyn Fn(&PreprocessState) -> PyResult, +) -> std::io::Result<()> { + println!( + "Processing {} into {} ...", + path.to_str().unwrap(), + out_path.to_str().unwrap(), + ); + let mut n: u32 = 0; + let mut wtr = csv::Writer::from_path(out_path)?; + process( + path, + &mut |line| { + if !line.contains("Star") { + return; + } + let body_res: Result = serde_json::from_str(&line); + if let Ok(body) = body_res { + if !body.body_type.contains("Star") { + return; + } + if let Some(sys) = systems.get(&body.systemId) { + let sub_type = body.subType; + let mult = get_mult(&sub_type); + let sys_name = sys.name.clone(); + let rec = SystemSerde { + id: n, + star_type: sub_type, + system: sys_name, + body: body.name, + mult, + distance: body.distance, + x: sys.coords.x, + y: sys.coords.y, + z: sys.coords.z, + }; + wtr.serialize(rec).unwrap(); + n += 1; + }; + } else { + eprintln!("\nError parsing: {}\n\t{:?}\n", line, body_res.unwrap_err()); + } + }, + callback, + ) + .unwrap(); + println!("Total Systems: {}", n); + systems.clear(); + Ok(()) +} + +pub fn preprocess_files( + bodies: &PathBuf, + systems: &PathBuf, + out_path: &PathBuf, + callback: &dyn Fn(&PreprocessState) -> PyResult, +) -> std::io::Result<()> { + if !out_path.exists() { + let mut systems = process_systems(systems, &callback); + process_bodies(bodies, out_path, &mut systems, &callback)?; + } else { + println!( + "File '{}' exists, not overwriting it", + out_path.to_str().unwrap() + ); + } + println!("Building index..."); + println!("Index result: {:?}", build_index(&out_path)); + Ok(()) +} diff --git a/rust/src/journal.rs b/rust/src/journal.rs new file mode 100644 index 0000000..3bcd5ae --- /dev/null +++ b/rust/src/journal.rs @@ -0,0 +1,169 @@ +use crate::common::get_fsd_info; +use crate::ship::Ship; + +use regex::Regex; +use serde::Deserialize; +use std::collections::HashMap; + +#[derive(Clone, Debug, PartialEq, Deserialize)] +pub struct Event { + #[serde(flatten)] + pub event: EventData, +} + +#[serde(tag = "event")] +#[derive(Clone, Debug, PartialEq, Deserialize)] +pub enum EventData { + Loadout(Loadout), + #[serde(other)] + Unknown, +} + +#[serde(rename_all = "PascalCase")] +#[derive(Clone, Debug, PartialEq, Deserialize)] +pub struct Modifier { + label: String, + value: f32, +} + +#[serde(rename_all = "PascalCase")] +#[derive(Clone, Debug, PartialEq, Deserialize)] +pub struct Engineering { + modifiers: Vec, +} + +#[derive(Clone, Debug, PartialEq, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Module { + engineering: Option, + item: String, + slot: String, +} + +#[derive(Clone, Debug, PartialEq, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct FuelCapacity { + main: f32, + reserve: f32, +} + +#[derive(Clone, Debug, PartialEq, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct Loadout { + #[serde(rename = "timestamp")] + timestamp: String, + ship: String, + ship_name: String, + ship_ident: String, + fuel_capacity: FuelCapacity, + unladen_mass: f32, + modules: Vec, +} + +impl Engineering { + fn to_hashmap(&self) -> HashMap { + let mut h = HashMap::new(); + for v in &self.modifiers { + h.insert(v.label.clone(), v.value); + } + return h; + } +} + +impl Loadout { + fn get_booster(&self) -> Option { + self.modules + .iter() + .cloned() + .filter_map(|m| { + let Module { item, .. } = m; + if item.starts_with("int_guardianfsdbooster") { + return item + .chars() + .last() + .unwrap() + .to_digit(10) + .map(|v| v as usize); + } + return None; + }) + .next() + } + + fn get_fsd(&self) -> Option<(String, Option)> { + self.modules + .iter() + .cloned() + .filter_map(|m| { + let Module { + slot, + engineering, + item, + } = m; + if slot == "FrameShiftDrive" { + return Some((item, engineering)); + } + return None; + }) + .next() + } + + pub fn try_into_ship(self) -> Result { + let fsd = self.get_fsd().ok_or("No FSD found!")?; + let booster = self.get_booster().unwrap_or(0); + let fsd_type = Regex::new(r"^int_hyperdrive_size(\d+)_class(\d+)$") + .unwrap() + .captures(&fsd.0); + let fsd_type: (usize, usize) = fsd_type + .map(|m| { + let s = m.get(1)?.as_str().to_owned().parse().ok()?; + let c = m.get(2)?.as_str().to_owned().parse().ok()?; + return Some((c, s)); + }) + .flatten() + .ok_or(format!("Invalid FSD found: {}", &fsd.0))?; + let eng = fsd + .1 + .map(|eng| eng.to_hashmap()) + .unwrap_or_else(HashMap::new); + let mut fsd_info = get_fsd_info(fsd_type.0, fsd_type.1)?; + let fsd_type = ( + "_EDCBA" + .chars() + .nth(fsd_type.0) + .ok_or(format!("Invalid FSD found: {}", &fsd.0))?, + fsd_type.1 as u8, + ); + fsd_info.extend(eng); + let max_fuel = fsd_info + .get("MaxFuel") + .ok_or(format!("Unknwon MaxFuelPerJump for FSD: {}", &fsd.0))?; + let opt_mass = fsd_info + .get("FSDOptimalMass") + .ok_or(format!("Unknwon FSDOptimalMass for FSD: {}", &fsd.0))?; + return Ship::new( + self.ship_name, + self.ship_ident, + self.ship, + self.unladen_mass, + self.fuel_capacity.main, + self.fuel_capacity.main, + fsd_type, + *max_fuel, + *opt_mass, + booster, + ); + } +} + +impl Event { + pub fn get_loadout(self) -> Option { + if let Event { + event: EventData::Loadout(loadout), + } = self + { + return Some(loadout); + } + None + } +} diff --git a/rust/src/ship.rs b/rust/src/ship.rs new file mode 100644 index 0000000..e5ea69c --- /dev/null +++ b/rust/src/ship.rs @@ -0,0 +1,271 @@ +use crate::common::get_fsd_booster_info; +use crate::journal::*; +use pyo3::conversion::ToPyObject; +use pyo3::prelude::*; +use pyo3::types::PyDict; +use regex::Regex; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::fs::File; +use std::io::{BufRead, BufReader}; +use std::path::PathBuf; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct FSD { + pub rating_val: f32, + pub class_val: f32, + pub opt_mass: f32, + pub max_fuel: f32, + pub boost: f32, + pub guardian_booster: f32, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Ship { + pub name: String, + pub ident: String, + pub ship_type: String, + pub base_mass: f32, + pub fuel_mass: f32, + pub fuel_capacity: f32, + pub fsd: FSD, +} + +impl Ship { + pub fn new( + name: String, + ident: String, + ship_type: String, + base_mass: f32, + fuel_mass: f32, + fuel_capacity: f32, + fsd_type: (char, u8), + max_fuel: f32, + opt_mass: f32, + guardian_booster: usize, + ) -> Result { + let rating_val: f32 = match fsd_type.0 { + 'A' => 12.0, + 'B' => 10.0, + 'C' => 8.0, + 'D' => 10.0, + 'E' => 11.0, + err => { + return Err(format!("Invalid rating: {}", err)); + } + }; + if fsd_type.1 < 2 || fsd_type.1 > 8 { + return Err(format!("Invalid class: {}", fsd_type.1)); + }; + + if guardian_booster!=0 { + return Err("Guardian booster not yet implemented!".to_owned()) + } + + let ret = Self { + name, + ident, + ship_type, + fuel_capacity, + fuel_mass, + base_mass, + fsd: FSD { + rating_val, + class_val: 2.0 + (0.15 * ((fsd_type.1 - 2) as f32)), + opt_mass, + max_fuel, + boost: 1.0, + guardian_booster: get_fsd_booster_info(guardian_booster)?, + }, + }; + Ok(ret) + } + + pub fn new_from_json(data: &str) -> Result { + match serde_json::from_str::(&data) { + Ok(Event { + event: EventData::Unknown, + }) => { + return Err(format!("Invalid Loadout event: {}", data)); + } + Ok(ev) => { + if let Some(loadout) = ev.get_loadout() { + return loadout.try_into_ship(); + } else { + return Err(format!("Invalid Loadout event: {}", data)); + } + } + Err(msg) => { + return Err(format!("{}", msg)); + } + }; + } + + pub fn new_from_journal() -> Result, String> { + let mut ret = HashMap::new(); + let re = Regex::new(r"^Journal\.\d{12}\.\d{2}\.log$").unwrap(); + let mut journals: Vec = Vec::new(); + let mut userprofile = PathBuf::from(std::env::var("Userprofile").unwrap()); + userprofile.push("Saved Games"); + userprofile.push("Frontier Developments"); + userprofile.push("Elite Dangerous"); + if let Ok(iter) = userprofile.read_dir() { + for entry in iter { + if let Ok(entry) = entry { + if re.is_match(&entry.file_name().to_string_lossy()) { + journals.push(entry.path()); + }; + } + } + } + journals.sort(); + + for journal in &journals { + let mut fh = BufReader::new(File::open(journal).unwrap()); + let mut line = String::new(); + while let Ok(n) = fh.read_line(&mut line) { + if n == 0 { + break; + } + match serde_json::from_str::(&line) { + Ok(Event { + event: EventData::Unknown, + }) => {} + Ok(ev) => { + if let Some(loadout) = ev.get_loadout() { + let mut ship = loadout.try_into_ship()?; + if ship.name == "" { + ship.name = "".to_owned(); + } + let key = format!( + "[{}] {} ({})", + ship.ident, + ship.name, + ship.ship_type.to_ascii_lowercase() + ); + ret.insert(key, ship); + } + } + Err(_) => {} + }; + line.clear(); + } + } + if ret.is_empty() { + return Err("No ships loaded!".to_owned()); + } + return Ok(ret); + } + + pub fn can_jump(&self, d: f32) -> bool { + self.fuel_cost(d) <= self.fsd.max_fuel.min(self.fuel_mass) + } + + pub fn boost(&mut self, boost: f32) { + self.fsd.boost = boost; + } + + pub fn refuel(&mut self) { + self.fuel_mass = self.fuel_capacity; + } + + pub fn make_jump(&mut self, d: f32) -> Option { + let cost = self.fuel_cost(d); + if cost > self.fsd.max_fuel.min(self.fuel_mass) { + return None; + } + self.fuel_mass -= cost; + self.fsd.boost = 1.0; + Some(cost) + } + + fn jump_range(&self, fuel: f32, booster: bool) -> f32 { + let mass = self.base_mass + fuel; + let mut fuel = self.fsd.max_fuel.min(fuel); + if booster { + fuel *= self.boost_fuel_mult(); + } + let opt_mass = self.fsd.opt_mass * self.fsd.boost; + return opt_mass * ((1000.0 * fuel) / self.fsd.rating_val).powf(self.fsd.class_val.recip()) + / mass; + } + + pub fn max_range(&self) -> f32 { + return self.jump_range(self.fsd.max_fuel, true); + } + + pub fn range(&self) -> f32 { + return self.jump_range(self.fuel_mass, true); + } + + fn boost_fuel_mult(&self) -> f32 { + if self.fsd.guardian_booster == 0.0 { + return 1.0; + } + + let base_range = self.jump_range(self.fuel_mass, false); // current range without booster + + return ((base_range + self.fsd.guardian_booster) / base_range).powf(self.fsd.class_val); + } + + pub fn fuel_cost(&self, d: f32) -> f32 { + if d == 0.0 { + return 0.0; + } + let mass = self.base_mass + self.fuel_mass; + let opt_mass = self.fsd.opt_mass * self.fsd.boost; + let base_cost = (d * mass) / opt_mass; + return (self.fsd.rating_val * 0.001 * base_cost.powf(self.fsd.class_val)) + / self.boost_fuel_mult(); + } +} + +/* +#[derive(Debug,Clone, Serialize, Deserialize, ToPyObject)] +pub struct FSD { + pub rating_val: f32, + pub class_val: f32, + pub opt_mass: f32, + pub max_fuel: f32, + pub boost: f32, + pub guardian_booster: f32, +} + +#[derive(Debug,Clone, Serialize, Deserialize, ToPyObject)] +pub struct Ship { + pub name: String, + pub ident: String, + pub ship_type: String, + pub base_mass: f32, + pub fuel_mass: f32, + pub fuel_capacity: f32, + pub fsd: FSD, +} +*/ + +impl FSD { + pub fn to_object(&self, py: Python) -> PyResult { + let elem = PyDict::new(py); + elem.set_item("rating_val", self.rating_val)?; + elem.set_item("class_val", self.class_val)?; + elem.set_item("opt_mass", self.opt_mass)?; + elem.set_item("max_fuel", self.max_fuel)?; + elem.set_item("boost", self.boost)?; + elem.set_item("guardian_booster", self.guardian_booster)?; + Ok(elem.to_object(py)) + } +} + +impl Ship { + pub fn to_object(&self, py: Python) -> PyResult { + let elem = PyDict::new(py); + elem.set_item("name", self.name.clone())?; + elem.set_item("ident", self.ident.clone())?; + elem.set_item("ship_type", self.ship_type.clone())?; + elem.set_item("base_mass", self.base_mass)?; + elem.set_item("fuel_mass", self.fuel_mass)?; + elem.set_item("fuel_capacity", self.fuel_capacity)?; + elem.set_item("fsd", self.fsd.to_object(py)?)?; + Ok(elem.to_object(py)) + } +}