From 5d2bb48a524bb005398cbc9e75a69e93379e129c Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Thu, 15 Dec 2022 15:31:15 +0100 Subject: [PATCH 1/8] add first working code --- .gitignore | 1 + Cargo.lock | 974 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 11 + src/main.rs | 69 ++++ 4 files changed, 1055 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..711a9d8 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,974 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anyhow" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cc" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chunked_transfer" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "departure" +version = "0.1.0" +dependencies = [ + "anyhow", + "scraper", + "ureq", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + +[[package]] +name = "dtoa-short" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" +dependencies = [ + "dtoa", +] + +[[package]] +name = "ego-tree" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68a4904193147e0a8dec3314640e6db742afd5f6e634f428a6af230d9b3591" + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "html5ever" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "js-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.138" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +dependencies = [ + "log", + "phf 0.10.1", + "phf_codegen 0.10.0", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "once_cell" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro2" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.8", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustls" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" +dependencies = [ + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "scraper" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5684396b456f3eb69ceeb34d1b5cb1a2f6acf7ca4452131efa3ba0ee2c2d0a70" +dependencies = [ + "cssparser", + "ego-tree", + "html5ever", + "matches", + "selectors", + "smallvec", + "tendril", +] + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" + +[[package]] +name = "serde" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e326c9ec8042f1b5da33252c8a37e9ffbd2c9bef0155215b6e6c80c790e05f91" + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "string_cache" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "syn" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "ureq" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97acb4c28a254fd7a4aeec976c46a7fa404eac4d7c134b30c75144846d7cb8f" +dependencies = [ + "base64", + "chunked_transfer", + "log", + "once_cell", + "rustls", + "url", + "webpki", + "webpki-roots", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" + +[[package]] +name = "web-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..773c0dd --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "departure" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +scraper = { version = "*", default-features = false } +anyhow = { version = "1.0.66", default-features = false } +ureq = { version = "*", default-features = false , features = ["tls"]} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..bb708f2 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,69 @@ +use anyhow::{anyhow, Result}; + +use scraper::{Html, Selector}; + +const SIEDLUNG: &str = + "https://www.vvo-online.de/de/fahrplan/aktuelle-abfahrten-ankuenfte/abfahrten?stopid=33006764"; + +fn main() -> Result<()> { + let message = query_server()?; + let html = Html::parse_document(&message); + + let departure_selector = get_departure_selector(); + let time_selector = get_time_selector(); + let late_selector = get_late_selector(); + + for departure_block in html.select(&departure_selector) { + let val = departure_block.value(); + println!("{}", val.attr("data-filter").unwrap().trim()); + + let late = extract_delay(departure_block, &late_selector); + for time_block in departure_block + .select(&time_selector) + .next() + .unwrap() + .children() + { + let value = time_block.value(); + + if value.is_text() { + let text = value.as_text().unwrap().trim(); + if !text.is_empty() { + print!("Abfahrt: {text}"); + if let Some(late_text) = &late { + print!(" | Verspätet: {late_text}"); + } + println!(); + } + } + } + println!(); + } + Ok(()) +} + +fn get_late_selector() -> Selector { + Selector::parse("span.late").unwrap() +} + +fn query_server() -> Result { + match ureq::get(SIEDLUNG).call() { + Ok(response) => Ok(response.into_string().map_err(|e| anyhow!(e))?), + Err(e) => Err(anyhow!(e)), + } +} + +fn extract_delay(departure_block: scraper::ElementRef, late_selector: &Selector) -> Option { + departure_block + .select(late_selector) + .next() + .map(|content| content.inner_html()) +} + +fn get_time_selector() -> Selector { + Selector::parse("div.col.c2of12.tour p").unwrap() +} + +fn get_departure_selector() -> Selector { + Selector::parse("li[data-filter][data-departure-id][data-departure-time]").unwrap() +} From ed8adc027d00da800103d33ab68be9834e0640dc Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Thu, 15 Dec 2022 15:34:47 +0100 Subject: [PATCH 2/8] refactor: implement Extractor --- src/extractor.rs | 29 +++++++++++++++++++++++++++++ src/main.rs | 27 ++++++++------------------- 2 files changed, 37 insertions(+), 19 deletions(-) create mode 100644 src/extractor.rs diff --git a/src/extractor.rs b/src/extractor.rs new file mode 100644 index 0000000..fd2f7a2 --- /dev/null +++ b/src/extractor.rs @@ -0,0 +1,29 @@ +use scraper::Selector; + +pub(crate) struct Extractor { + pub time: Selector, + pub departure: Selector, + pub delay: Selector, +} + +impl Extractor { + pub(crate) fn new() -> Self { + Self { + time: Self::get_time_selector(), + departure: Self::get_departure_selector(), + delay: Self::get_late_selector(), + } + } + + fn get_time_selector() -> Selector { + Selector::parse("div.col.c2of12.tour p").unwrap() + } + + fn get_departure_selector() -> Selector { + Selector::parse("li[data-filter][data-departure-id][data-departure-time]").unwrap() + } + + fn get_late_selector() -> Selector { + Selector::parse("span.late").unwrap() + } +} diff --git a/src/main.rs b/src/main.rs index bb708f2..9bd56bc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,10 @@ -use anyhow::{anyhow, Result}; +mod extractor; +use anyhow::{anyhow, Result}; use scraper::{Html, Selector}; +use extractor::Extractor; + const SIEDLUNG: &str = "https://www.vvo-online.de/de/fahrplan/aktuelle-abfahrten-ankuenfte/abfahrten?stopid=33006764"; @@ -9,17 +12,15 @@ fn main() -> Result<()> { let message = query_server()?; let html = Html::parse_document(&message); - let departure_selector = get_departure_selector(); - let time_selector = get_time_selector(); - let late_selector = get_late_selector(); + let extractor = Extractor::new(); - for departure_block in html.select(&departure_selector) { + for departure_block in html.select(&extractor.departure) { let val = departure_block.value(); println!("{}", val.attr("data-filter").unwrap().trim()); - let late = extract_delay(departure_block, &late_selector); + let late = extract_delay(departure_block, &extractor.delay); for time_block in departure_block - .select(&time_selector) + .select(&extractor.time) .next() .unwrap() .children() @@ -42,10 +43,6 @@ fn main() -> Result<()> { Ok(()) } -fn get_late_selector() -> Selector { - Selector::parse("span.late").unwrap() -} - fn query_server() -> Result { match ureq::get(SIEDLUNG).call() { Ok(response) => Ok(response.into_string().map_err(|e| anyhow!(e))?), @@ -59,11 +56,3 @@ fn extract_delay(departure_block: scraper::ElementRef, late_selector: &Selector) .next() .map(|content| content.inner_html()) } - -fn get_time_selector() -> Selector { - Selector::parse("div.col.c2of12.tour p").unwrap() -} - -fn get_departure_selector() -> Selector { - Selector::parse("li[data-filter][data-departure-id][data-departure-time]").unwrap() -} From 7f11abdbd463cde40b2cd53bf880c8851325dcf9 Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Thu, 15 Dec 2022 15:48:24 +0100 Subject: [PATCH 3/8] refactor main --- src/main.rs | 60 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9bd56bc..1f68032 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ mod extractor; -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, bail, Result}; use scraper::{Html, Selector}; use extractor::Extractor; @@ -14,35 +14,45 @@ fn main() -> Result<()> { let extractor = Extractor::new(); - for departure_block in html.select(&extractor.departure) { - let val = departure_block.value(); - println!("{}", val.attr("data-filter").unwrap().trim()); - - let late = extract_delay(departure_block, &extractor.delay); - for time_block in departure_block - .select(&extractor.time) - .next() - .unwrap() - .children() - { - let value = time_block.value(); - - if value.is_text() { - let text = value.as_text().unwrap().trim(); - if !text.is_empty() { - print!("Abfahrt: {text}"); - if let Some(late_text) = &late { - print!(" | Verspätet: {late_text}"); - } - println!(); - } - } - } + for departure in get_departures(&html, &extractor) { + println!("{}", get_transport_line(departure)); + println!("{}", get_times(departure, &extractor)?); println!(); } Ok(()) } +fn get_times(departure: scraper::ElementRef, extractor: &Extractor) -> Result { + let delay = extract_delay(departure, &extractor.delay); + for time_block in departure.select(&extractor.time).next().unwrap().children() { + let value = time_block.value(); + + if value.is_text() { + let scheduled_time = value.as_text().unwrap().trim(); + if !scheduled_time.is_empty() { + let mut result = "Abfahrt: ".to_owned(); + result.push_str(scheduled_time); + + if let Some(late_text) = &delay { + result.push_str(" | Verspätet: "); + result.push_str(late_text); + } + return Ok(result); + } + } + } + bail!("could not get the times") +} + +fn get_departures<'a>(html: &'a Html, extractor: &'a Extractor) -> scraper::html::Select<'a, 'a> { + html.select(&extractor.departure) +} + +fn get_transport_line(departure_block: scraper::ElementRef) -> &str { + let val = departure_block.value(); + val.attr("data-filter").unwrap().trim() +} + fn query_server() -> Result { match ureq::get(SIEDLUNG).call() { Ok(response) => Ok(response.into_string().map_err(|e| anyhow!(e))?), From 98c1d266b190cc583f7c86be1d0ac04d1b875f8a Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Thu, 15 Dec 2022 15:52:05 +0100 Subject: [PATCH 4/8] refactor main --- src/main.rs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1f68032..919e326 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ mod extractor; -use anyhow::{anyhow, bail, Result}; +use anyhow::{anyhow, bail, Context, Result}; use scraper::{Html, Selector}; use extractor::Extractor; @@ -15,7 +15,7 @@ fn main() -> Result<()> { let extractor = Extractor::new(); for departure in get_departures(&html, &extractor) { - println!("{}", get_transport_line(departure)); + println!("{}", get_transport_line(departure)?); println!("{}", get_times(departure, &extractor)?); println!(); } @@ -24,11 +24,19 @@ fn main() -> Result<()> { fn get_times(departure: scraper::ElementRef, extractor: &Extractor) -> Result { let delay = extract_delay(departure, &extractor.delay); - for time_block in departure.select(&extractor.time).next().unwrap().children() { + for time_block in departure + .select(&extractor.time) + .next() + .context("extracting time block")? + .children() + { let value = time_block.value(); if value.is_text() { - let scheduled_time = value.as_text().unwrap().trim(); + let scheduled_time = value + .as_text() + .context("extracting text of scheduled time")? + .trim(); if !scheduled_time.is_empty() { let mut result = "Abfahrt: ".to_owned(); result.push_str(scheduled_time); @@ -48,9 +56,12 @@ fn get_departures<'a>(html: &'a Html, extractor: &'a Extractor) -> scraper::html html.select(&extractor.departure) } -fn get_transport_line(departure_block: scraper::ElementRef) -> &str { +fn get_transport_line(departure_block: scraper::ElementRef) -> Result<&str> { let val = departure_block.value(); - val.attr("data-filter").unwrap().trim() + Ok(val + .attr("data-filter") + .context("accessing 'data-filter'")? + .trim()) } fn query_server() -> Result { From ed9d3d7c7389bfc77bdfccfa95f5f4be1ef92a89 Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Thu, 15 Dec 2022 16:03:18 +0100 Subject: [PATCH 5/8] refactor main --- src/extractor.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++- src/main.rs | 59 ++++-------------------------------------------- 2 files changed, 60 insertions(+), 55 deletions(-) diff --git a/src/extractor.rs b/src/extractor.rs index fd2f7a2..88c8733 100644 --- a/src/extractor.rs +++ b/src/extractor.rs @@ -1,4 +1,5 @@ -use scraper::Selector; +use anyhow::{bail, Context, Result}; +use scraper::{Html, Selector}; pub(crate) struct Extractor { pub time: Selector, @@ -26,4 +27,57 @@ impl Extractor { fn get_late_selector() -> Selector { Selector::parse("span.late").unwrap() } + + pub(crate) fn get_departures<'a>(&'a self, html: &'a Html) -> scraper::html::Select<'a, 'a> { + html.select(&self.departure) + } + + pub(crate) fn get_transport_line(departure_block: scraper::ElementRef) -> Result<&str> { + let val = departure_block.value(); + let result = val + .attr("data-filter") + .context("accessing 'data-filter'")? + .trim(); + Ok(result) + } + + pub(crate) fn extract_delay( + departure_block: scraper::ElementRef, + late_selector: &Selector, + ) -> Option { + departure_block + .select(late_selector) + .next() + .map(|content| content.inner_html()) + } + + pub(crate) fn get_times(&self, departure: scraper::ElementRef) -> Result { + let delay = Self::extract_delay(departure, &self.delay); + for time_block in departure + .select(&self.time) + .next() + .context("extracting time block")? + .children() + { + let value = time_block.value(); + + if value.is_text() { + let scheduled_time = value + .as_text() + .context("extracting text of scheduled time")? + .trim(); + if !scheduled_time.is_empty() { + let mut result = "Abfahrt: ".to_owned(); + result.push_str(scheduled_time); + + if let Some(late_text) = &delay { + result.push_str(" | Verspätet: "); + result.push_str(late_text); + } + return Ok(result); + } + } + } + bail!("could not get the times") + } } diff --git a/src/main.rs b/src/main.rs index 919e326..927a790 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ mod extractor; -use anyhow::{anyhow, bail, Context, Result}; -use scraper::{Html, Selector}; +use anyhow::{anyhow, Result}; +use scraper::Html; use extractor::Extractor; @@ -14,66 +14,17 @@ fn main() -> Result<()> { let extractor = Extractor::new(); - for departure in get_departures(&html, &extractor) { - println!("{}", get_transport_line(departure)?); - println!("{}", get_times(departure, &extractor)?); + for departure in extractor.get_departures(&html) { + println!("{}", Extractor::get_transport_line(departure)?); + println!("{}", extractor.get_times(departure)?); println!(); } Ok(()) } -fn get_times(departure: scraper::ElementRef, extractor: &Extractor) -> Result { - let delay = extract_delay(departure, &extractor.delay); - for time_block in departure - .select(&extractor.time) - .next() - .context("extracting time block")? - .children() - { - let value = time_block.value(); - - if value.is_text() { - let scheduled_time = value - .as_text() - .context("extracting text of scheduled time")? - .trim(); - if !scheduled_time.is_empty() { - let mut result = "Abfahrt: ".to_owned(); - result.push_str(scheduled_time); - - if let Some(late_text) = &delay { - result.push_str(" | Verspätet: "); - result.push_str(late_text); - } - return Ok(result); - } - } - } - bail!("could not get the times") -} - -fn get_departures<'a>(html: &'a Html, extractor: &'a Extractor) -> scraper::html::Select<'a, 'a> { - html.select(&extractor.departure) -} - -fn get_transport_line(departure_block: scraper::ElementRef) -> Result<&str> { - let val = departure_block.value(); - Ok(val - .attr("data-filter") - .context("accessing 'data-filter'")? - .trim()) -} - fn query_server() -> Result { match ureq::get(SIEDLUNG).call() { Ok(response) => Ok(response.into_string().map_err(|e| anyhow!(e))?), Err(e) => Err(anyhow!(e)), } } - -fn extract_delay(departure_block: scraper::ElementRef, late_selector: &Selector) -> Option { - departure_block - .select(late_selector) - .next() - .map(|content| content.inner_html()) -} From 40c0d3c2cc857598d17e951dd550aab9b538ae7c Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Thu, 15 Dec 2022 16:06:53 +0100 Subject: [PATCH 6/8] refactor main --- Cargo.toml | 2 +- src/main.rs | 15 +++------------ src/query.rs | 11 +++++++++++ 3 files changed, 15 insertions(+), 13 deletions(-) create mode 100644 src/query.rs diff --git a/Cargo.toml b/Cargo.toml index 773c0dd..71bb1dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,5 +7,5 @@ edition = "2021" [dependencies] scraper = { version = "*", default-features = false } -anyhow = { version = "1.0.66", default-features = false } +anyhow = { version = "*", default-features = false } ureq = { version = "*", default-features = false , features = ["tls"]} diff --git a/src/main.rs b/src/main.rs index 927a790..8314150 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,15 +1,13 @@ mod extractor; +mod query; -use anyhow::{anyhow, Result}; +use anyhow::Result; use scraper::Html; use extractor::Extractor; -const SIEDLUNG: &str = - "https://www.vvo-online.de/de/fahrplan/aktuelle-abfahrten-ankuenfte/abfahrten?stopid=33006764"; - fn main() -> Result<()> { - let message = query_server()?; + let message = query::query_server()?; let html = Html::parse_document(&message); let extractor = Extractor::new(); @@ -21,10 +19,3 @@ fn main() -> Result<()> { } Ok(()) } - -fn query_server() -> Result { - match ureq::get(SIEDLUNG).call() { - Ok(response) => Ok(response.into_string().map_err(|e| anyhow!(e))?), - Err(e) => Err(anyhow!(e)), - } -} diff --git a/src/query.rs b/src/query.rs new file mode 100644 index 0000000..51b8e83 --- /dev/null +++ b/src/query.rs @@ -0,0 +1,11 @@ +use anyhow::{anyhow, Result}; + +pub(crate) const SIEDLUNG: &str = + "https://www.vvo-online.de/de/fahrplan/aktuelle-abfahrten-ankuenfte/abfahrten?stopid=33006764"; + +pub(crate) fn query_server() -> Result { + match ureq::get(SIEDLUNG).call() { + Ok(response) => Ok(response.into_string().map_err(|e| anyhow!(e))?), + Err(e) => Err(anyhow!(e)), + } +} From bcdec86d1eecfef97574d920403e64957a95f658 Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Thu, 15 Dec 2022 16:09:17 +0100 Subject: [PATCH 7/8] strip debug symbols for release --- Cargo.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 71bb1dd..38572d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,9 +3,10 @@ name = "departure" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] scraper = { version = "*", default-features = false } anyhow = { version = "*", default-features = false } ureq = { version = "*", default-features = false , features = ["tls"]} + +[profile.release] +strip = true From 2db1f9e13e542f9ba6a5ca6cc4080ca001b61309 Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Thu, 15 Dec 2022 16:19:36 +0100 Subject: [PATCH 8/8] enable fat LTO, optimize for size --- Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 38572d2..71a103c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,3 +10,5 @@ ureq = { version = "*", default-features = false , features = ["tls"]} [profile.release] strip = true +lto = true +opt-level = "z"