From 43374bec4a2d83f6330df60d44d65e216e1b6d85 Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Wed, 7 May 2025 18:22:26 -0300 Subject: [PATCH 01/15] Added recurrent process example with async inner calls --- Cargo.lock | 1212 ++++++++++++++++- Cargo.toml | 2 + concurrency/Cargo.toml | 3 +- concurrency/src/gen_server.rs | 14 +- concurrency/src/lib.rs | 2 + concurrency/src/time.rs | 23 + examples/bank/src/server.rs | 4 +- examples/name_server/src/server.rs | 4 +- examples/name_server_with_error/src/server.rs | 4 +- examples/updater/Cargo.toml | 15 + examples/updater/src/main.rs | 27 + examples/updater/src/messages.rs | 11 + examples/updater/src/server.rs | 77 ++ rt/src/lib.rs | 3 +- rt/src/tokio/mod.rs | 1 + 15 files changed, 1368 insertions(+), 34 deletions(-) create mode 100644 concurrency/src/time.rs create mode 100644 examples/updater/Cargo.toml create mode 100644 examples/updater/src/main.rs create mode 100644 examples/updater/src/messages.rs create mode 100644 examples/updater/src/server.rs diff --git a/Cargo.lock b/Cargo.lock index 745550c..4d4563f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,7 +44,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -56,30 +56,513 @@ dependencies = [ "tracing", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + [[package]] name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "cc" +version = "1.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" +dependencies = [ + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "gimli" version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -92,6 +575,18 @@ version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + [[package]] name = "lock_api" version = "0.4.12" @@ -123,6 +618,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "miniz_oxide" version = "0.8.5" @@ -139,8 +640,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", - "windows-sys", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", ] [[package]] @@ -161,6 +662,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -186,6 +704,50 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "openssl" +version = "0.10.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +dependencies = [ + "bitflags 2.9.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "overload" version = "0.1.1" @@ -212,15 +774,27 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "pin-project-lite" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "ping_pong" version = "0.1.0" @@ -230,6 +804,12 @@ dependencies = [ "tracing", ] +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "proc-macro2" version = "1.0.94" @@ -248,13 +828,19 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "redox_syscall" version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags", + "bitflags 2.9.0", ] [[package]] @@ -301,6 +887,56 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rq" +version = "0.1.0" +dependencies = [ + "futures", + "reqwest", + "spawned-rt", + "tokio", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -308,10 +944,120 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] -name = "scopeguard" -version = "1.2.0" +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] [[package]] name = "sharded-slab" @@ -322,6 +1068,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -331,6 +1083,15 @@ dependencies = [ "libc", ] +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "smallvec" version = "1.14.0" @@ -344,13 +1105,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "spawned-concurrency" version = "0.1.0" dependencies = [ + "futures", "spawned-rt", "tracing", ] @@ -364,6 +1126,12 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "syn" version = "2.0.100" @@ -375,6 +1143,57 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "thread_local" version = "1.1.8" @@ -385,6 +1204,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tokio" version = "1.44.1" @@ -400,7 +1229,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -414,6 +1243,35 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.41" @@ -476,24 +1334,169 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "updater" +version = "0.1.0" +dependencies = [ + "futures", + "reqwest", + "spawned-concurrency", + "spawned-rt", + "tracing", +] + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "winapi" version = "0.3.9" @@ -516,13 +1519,46 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -531,28 +1567,46 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -565,26 +1619,148 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index 02379aa..76a6ca8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,9 @@ members = [ "examples/ping_pong", "examples/name_server", "examples/name_server_with_error", + "examples/updater", "examples/bank", + "examples/rq", ] [workspace.dependencies] diff --git a/concurrency/Cargo.toml b/concurrency/Cargo.toml index 9739dbf..7e9f20c 100644 --- a/concurrency/Cargo.toml +++ b/concurrency/Cargo.toml @@ -5,4 +5,5 @@ edition = "2024" [dependencies] spawned-rt = { workspace = true } -tracing = { workspace = true } \ No newline at end of file +tracing = { workspace = true } +futures = "0.3.1" \ No newline at end of file diff --git a/concurrency/src/gen_server.rs b/concurrency/src/gen_server.rs index 11ec651..4d84f19 100644 --- a/concurrency/src/gen_server.rs +++ b/concurrency/src/gen_server.rs @@ -2,9 +2,9 @@ //! See examples/name_server for a usage example. use std::{ fmt::Debug, - panic::{AssertUnwindSafe, catch_unwind}, + panic::AssertUnwindSafe, }; - +use futures::future::FutureExt as _; use spawned_rt::{self as rt, JoinHandle, mpsc, oneshot}; use crate::error::GenServerError; @@ -136,9 +136,7 @@ where let (keep_running, error) = match message { Some(GenServerInMsg::Call { sender, message }) => { let (keep_running, error, response) = - match catch_unwind(AssertUnwindSafe(|| { - self.handle_call(message, tx, state) - })) { + match AssertUnwindSafe(self.handle_call(message, tx, state)).catch_unwind().await { Ok(response) => match response { CallResponse::Reply(response) => (true, None, Ok(response)), CallResponse::Stop(response) => (false, None, Ok(response)), @@ -154,7 +152,7 @@ where (keep_running, error) } Some(GenServerInMsg::Cast { message }) => { - match catch_unwind(AssertUnwindSafe(|| self.handle_cast(message, tx, state))) { + match AssertUnwindSafe(self.handle_cast(message, tx, state)).catch_unwind().await { Ok(response) => match response { CastResponse::NoReply => (true, None), CastResponse::Stop => (false, None), @@ -183,12 +181,12 @@ where message: Self::InMsg, tx: &mpsc::Sender>, state: &mut Self::State, - ) -> CallResponse; + ) -> impl std::future::Future> + Send; fn handle_cast( &mut self, _message: Self::InMsg, _tx: &mpsc::Sender>, state: &mut Self::State, - ) -> CastResponse; + ) -> impl std::future::Future + Send; } diff --git a/concurrency/src/lib.rs b/concurrency/src/lib.rs index cae8218..ab6d8b0 100644 --- a/concurrency/src/lib.rs +++ b/concurrency/src/lib.rs @@ -4,7 +4,9 @@ mod error; mod gen_server; mod process; +mod time; pub use error::GenServerError; pub use gen_server::{CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg}; pub use process::{Process, ProcessInfo, send}; +pub use time::send_after; diff --git a/concurrency/src/time.rs b/concurrency/src/time.rs new file mode 100644 index 0000000..de8bb12 --- /dev/null +++ b/concurrency/src/time.rs @@ -0,0 +1,23 @@ +use std::time::Duration; + +use spawned_rt::{self as rt, mpsc::Sender, JoinHandle}; + +use crate::{GenServer, GenServerInMsg}; + + + +// Sends a message after a given period to the specified GenServer. The task terminates +// once the send has completed +pub fn send_after( + period: Duration, + tx: Sender>, + message: T::InMsg, +) -> JoinHandle<()> +where + T: GenServer + 'static, +{ + rt::spawn(async move { + rt::sleep(period).await; + let _ = tx.send(GenServerInMsg::Cast { message } ); + }) +} \ No newline at end of file diff --git a/examples/bank/src/server.rs b/examples/bank/src/server.rs index 44fe376..feab27a 100644 --- a/examples/bank/src/server.rs +++ b/examples/bank/src/server.rs @@ -56,7 +56,7 @@ impl GenServer for Bank { Self {} } - fn handle_call( + async fn handle_call( &mut self, message: InMessage, _tx: &Sender, @@ -102,7 +102,7 @@ impl GenServer for Bank { } } - fn handle_cast( + async fn handle_cast( &mut self, _message: InMessage, _tx: &Sender, diff --git a/examples/name_server/src/server.rs b/examples/name_server/src/server.rs index 9520271..4a2671f 100644 --- a/examples/name_server/src/server.rs +++ b/examples/name_server/src/server.rs @@ -41,7 +41,7 @@ impl GenServer for NameServer { HashMap::new() } - fn handle_call( + async fn handle_call( &mut self, message: InMessage, _tx: &Sender, @@ -61,7 +61,7 @@ impl GenServer for NameServer { } } - fn handle_cast( + async fn handle_cast( &mut self, _message: InMessage, _tx: &Sender, diff --git a/examples/name_server_with_error/src/server.rs b/examples/name_server_with_error/src/server.rs index 71839bb..c1dcbf5 100644 --- a/examples/name_server_with_error/src/server.rs +++ b/examples/name_server_with_error/src/server.rs @@ -44,7 +44,7 @@ impl GenServer for NameServer { NameServer {} } - fn handle_call( + async fn handle_call( &mut self, message: InMessage, _tx: &Sender, @@ -68,7 +68,7 @@ impl GenServer for NameServer { } } - fn handle_cast( + async fn handle_cast( &mut self, _message: InMessage, _tx: &Sender, diff --git a/examples/updater/Cargo.toml b/examples/updater/Cargo.toml new file mode 100644 index 0000000..ad8e76a --- /dev/null +++ b/examples/updater/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "updater" +version = "0.1.0" +edition = "2024" + +[dependencies] +spawned-rt = { workspace = true } +spawned-concurrency = { workspace = true } +tracing = { workspace = true } +reqwest = { version = "0.11", features = ["blocking"] } +futures = "0.3.1" + +[[bin]] +name = "updater" +path = "src/main.rs" \ No newline at end of file diff --git a/examples/updater/src/main.rs b/examples/updater/src/main.rs new file mode 100644 index 0000000..a51906b --- /dev/null +++ b/examples/updater/src/main.rs @@ -0,0 +1,27 @@ +//! Example to test a recurrent gen_server. +//! +//! Just activates periodically and performs an http request +//! + +mod messages; +mod server; + +use std::{thread, time::Duration}; + +use messages::UpdaterOutMessage; +use server::UpdaterServer; +use spawned_concurrency::GenServer as _; +use spawned_rt as rt; + +fn main() { + rt::run(async { + let mut update_server = UpdaterServer::start(); + + let result = UpdaterServer::check(&mut update_server, "ea".to_string()).await; + tracing::info!("Update check done: {result:?}"); + assert_eq!(result, UpdaterOutMessage::Ok); + + // giving it some time before ending + thread::sleep(Duration::from_secs(10)); + }) +} diff --git a/examples/updater/src/messages.rs b/examples/updater/src/messages.rs new file mode 100644 index 0000000..beed32d --- /dev/null +++ b/examples/updater/src/messages.rs @@ -0,0 +1,11 @@ +#[derive(Debug, Clone)] +pub enum UpdaterInMessage { + Check(String), +} + +#[allow(dead_code)] +#[derive(Debug, Clone, PartialEq)] +pub enum UpdaterOutMessage { + Ok, + Error, +} diff --git a/examples/updater/src/server.rs b/examples/updater/src/server.rs new file mode 100644 index 0000000..a362c27 --- /dev/null +++ b/examples/updater/src/server.rs @@ -0,0 +1,77 @@ +use std::{collections::HashMap, time::Duration}; + +use spawned_concurrency::{ + CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, send_after, +}; +use spawned_rt::mpsc::Sender; + +use crate::messages::{UpdaterInMessage as InMessage, UpdaterOutMessage as OutMessage}; + +type UpdateServerHandle = GenServerHandle; +type UpdateServerMessage = GenServerInMsg; +type UpdateServerState = HashMap; + +pub struct UpdaterServer {} + +impl UpdaterServer { + pub async fn check(server: &mut UpdateServerHandle, url: String) -> OutMessage { + match server.cast(InMessage::Check(url)).await { + Ok(_) => OutMessage::Ok, + Err(_) => OutMessage::Error, + } + } +} + +impl GenServer for UpdaterServer { + type InMsg = InMessage; + type OutMsg = OutMessage; + type Error = std::fmt::Error; + type State = UpdateServerState; + + fn new() -> Self { + Self {} + } + + fn initial_state(&self) -> Self::State { + HashMap::new() + } + + async fn handle_call( + &mut self, + _message: InMessage, + _tx: &Sender, + _state: &mut Self::State, + ) -> CallResponse { + CallResponse::Reply(OutMessage::Ok) + } + + async fn handle_cast( + &mut self, + message: InMessage, + tx: &Sender, + _state: &mut Self::State, + ) -> CastResponse { + match message { + Self::InMsg::Check(url) => { + send_after( + Duration::from_millis(1000), + tx.clone(), + InMessage::Check("url".to_string()), + ); + tracing::info!("Fetching: {url:?}"); + let resp = req().await; + + tracing::info!("Response: {resp:?}"); + + CastResponse::NoReply + } + } + } +} + +async fn req() -> Result { + reqwest::get("https://httpbin.org/ip") + .await? + .text() + .await +} diff --git a/rt/src/lib.rs b/rt/src/lib.rs index 848ce5c..19c0126 100644 --- a/rt/src/lib.rs +++ b/rt/src/lib.rs @@ -16,6 +16,7 @@ use tracing_subscriber::FmtSubscriber; use tracing_subscriber::filter::Directive; pub use crate::tokio::mpsc; +pub use crate::tokio::sleep; pub use crate::tokio::oneshot; pub use crate::tokio::{JoinHandle, Runtime, spawn}; @@ -30,7 +31,7 @@ fn init_tracing() { let subscriber = FmtSubscriber::builder() .with_env_filter( EnvFilter::builder() - .with_default_directive(Directive::from_str("trace").unwrap()) + .with_default_directive(Directive::from_str("info").unwrap()) .from_env_lossy(), ) .finish(); diff --git a/rt/src/tokio/mod.rs b/rt/src/tokio/mod.rs index c68d38f..030d282 100644 --- a/rt/src/tokio/mod.rs +++ b/rt/src/tokio/mod.rs @@ -3,6 +3,7 @@ pub mod mpsc; pub mod oneshot; pub use tokio::{ + time::sleep, runtime::Runtime, task::{JoinHandle, spawn}, }; From 9b7bb59c6cf0ea91b3f89ad812a5375fb98fbf96 Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Wed, 7 May 2025 18:25:58 -0300 Subject: [PATCH 02/15] Added recurrent process example with async inner calls --- Cargo.lock | 10 ---------- Cargo.toml | 1 - 2 files changed, 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d4563f..ee38b85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -927,16 +927,6 @@ dependencies = [ "winreg", ] -[[package]] -name = "rq" -version = "0.1.0" -dependencies = [ - "futures", - "reqwest", - "spawned-rt", - "tokio", -] - [[package]] name = "rustc-demangle" version = "0.1.24" diff --git a/Cargo.toml b/Cargo.toml index 76a6ca8..2ec1059 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,6 @@ members = [ "examples/name_server_with_error", "examples/updater", "examples/bank", - "examples/rq", ] [workspace.dependencies] From 22b58fcfc4ee9de90a7c6c3c7dddf8764f3d7af3 Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Thu, 8 May 2025 17:42:20 -0300 Subject: [PATCH 03/15] Added recurrent process example forcing syncronous inner calls --- Cargo.lock | 1177 ++++++++++++++++++++++++++++++++++++++- Cargo.toml | 1 + concurrency/src/lib.rs | 2 + concurrency/src/time.rs | 23 + rt/src/lib.rs | 3 +- rt/src/tokio/mod.rs | 1 + 6 files changed, 1188 insertions(+), 19 deletions(-) create mode 100644 concurrency/src/time.rs diff --git a/Cargo.lock b/Cargo.lock index 745550c..06f7b33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,7 +44,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -56,30 +56,481 @@ dependencies = [ "tracing", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + [[package]] name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "cc" +version = "1.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" +dependencies = [ + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "gimli" version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -92,6 +543,18 @@ version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + [[package]] name = "lock_api" version = "0.4.12" @@ -123,6 +586,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "miniz_oxide" version = "0.8.5" @@ -139,8 +608,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", - "windows-sys", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", ] [[package]] @@ -161,6 +630,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -186,6 +672,50 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "openssl" +version = "0.10.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +dependencies = [ + "bitflags 2.9.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "overload" version = "0.1.1" @@ -212,15 +742,27 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "pin-project-lite" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "ping_pong" version = "0.1.0" @@ -230,6 +772,21 @@ dependencies = [ "tracing", ] +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "proc-macro2" version = "1.0.94" @@ -248,13 +805,19 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "redox_syscall" version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags", + "bitflags 2.9.0", ] [[package]] @@ -301,6 +864,46 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -308,10 +911,120 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] -name = "scopeguard" -version = "1.2.0" +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] [[package]] name = "sharded-slab" @@ -322,6 +1035,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -331,6 +1050,15 @@ dependencies = [ "libc", ] +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "smallvec" version = "1.14.0" @@ -344,7 +1072,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -364,6 +1092,12 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "syn" version = "2.0.100" @@ -375,6 +1109,57 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys 0.52.0", +] + [[package]] name = "thread_local" version = "1.1.8" @@ -385,6 +1170,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tokio" version = "1.44.1" @@ -400,7 +1195,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -414,6 +1209,35 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.41" @@ -476,24 +1300,163 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "updater" +version = "0.1.0" +dependencies = [ + "futures", + "reqwest", + "spawned-concurrency", + "spawned-rt", + "tracing", +] + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "winapi" version = "0.3.9" @@ -516,13 +1479,46 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -531,28 +1527,46 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -565,26 +1579,153 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index 02379aa..1901a5c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ members = [ "examples/name_server", "examples/name_server_with_error", "examples/bank", + "examples/updater", ] [workspace.dependencies] diff --git a/concurrency/src/lib.rs b/concurrency/src/lib.rs index cae8218..ab6d8b0 100644 --- a/concurrency/src/lib.rs +++ b/concurrency/src/lib.rs @@ -4,7 +4,9 @@ mod error; mod gen_server; mod process; +mod time; pub use error::GenServerError; pub use gen_server::{CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg}; pub use process::{Process, ProcessInfo, send}; +pub use time::send_after; diff --git a/concurrency/src/time.rs b/concurrency/src/time.rs new file mode 100644 index 0000000..de8bb12 --- /dev/null +++ b/concurrency/src/time.rs @@ -0,0 +1,23 @@ +use std::time::Duration; + +use spawned_rt::{self as rt, mpsc::Sender, JoinHandle}; + +use crate::{GenServer, GenServerInMsg}; + + + +// Sends a message after a given period to the specified GenServer. The task terminates +// once the send has completed +pub fn send_after( + period: Duration, + tx: Sender>, + message: T::InMsg, +) -> JoinHandle<()> +where + T: GenServer + 'static, +{ + rt::spawn(async move { + rt::sleep(period).await; + let _ = tx.send(GenServerInMsg::Cast { message } ); + }) +} \ No newline at end of file diff --git a/rt/src/lib.rs b/rt/src/lib.rs index 848ce5c..19c0126 100644 --- a/rt/src/lib.rs +++ b/rt/src/lib.rs @@ -16,6 +16,7 @@ use tracing_subscriber::FmtSubscriber; use tracing_subscriber::filter::Directive; pub use crate::tokio::mpsc; +pub use crate::tokio::sleep; pub use crate::tokio::oneshot; pub use crate::tokio::{JoinHandle, Runtime, spawn}; @@ -30,7 +31,7 @@ fn init_tracing() { let subscriber = FmtSubscriber::builder() .with_env_filter( EnvFilter::builder() - .with_default_directive(Directive::from_str("trace").unwrap()) + .with_default_directive(Directive::from_str("info").unwrap()) .from_env_lossy(), ) .finish(); diff --git a/rt/src/tokio/mod.rs b/rt/src/tokio/mod.rs index c68d38f..030d282 100644 --- a/rt/src/tokio/mod.rs +++ b/rt/src/tokio/mod.rs @@ -3,6 +3,7 @@ pub mod mpsc; pub mod oneshot; pub use tokio::{ + time::sleep, runtime::Runtime, task::{JoinHandle, spawn}, }; From 34576a2693aab0a197ccc6d40cf9d34b17f17ab4 Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Thu, 8 May 2025 17:42:36 -0300 Subject: [PATCH 04/15] Added recurrent process example forcing syncronous inner calls --- examples/updater/Cargo.toml | 15 +++++++ examples/updater/src/main.rs | 27 +++++++++++ examples/updater/src/messages.rs | 11 +++++ examples/updater/src/server.rs | 77 ++++++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+) create mode 100644 examples/updater/Cargo.toml create mode 100644 examples/updater/src/main.rs create mode 100644 examples/updater/src/messages.rs create mode 100644 examples/updater/src/server.rs diff --git a/examples/updater/Cargo.toml b/examples/updater/Cargo.toml new file mode 100644 index 0000000..ad8e76a --- /dev/null +++ b/examples/updater/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "updater" +version = "0.1.0" +edition = "2024" + +[dependencies] +spawned-rt = { workspace = true } +spawned-concurrency = { workspace = true } +tracing = { workspace = true } +reqwest = { version = "0.11", features = ["blocking"] } +futures = "0.3.1" + +[[bin]] +name = "updater" +path = "src/main.rs" \ No newline at end of file diff --git a/examples/updater/src/main.rs b/examples/updater/src/main.rs new file mode 100644 index 0000000..a51906b --- /dev/null +++ b/examples/updater/src/main.rs @@ -0,0 +1,27 @@ +//! Example to test a recurrent gen_server. +//! +//! Just activates periodically and performs an http request +//! + +mod messages; +mod server; + +use std::{thread, time::Duration}; + +use messages::UpdaterOutMessage; +use server::UpdaterServer; +use spawned_concurrency::GenServer as _; +use spawned_rt as rt; + +fn main() { + rt::run(async { + let mut update_server = UpdaterServer::start(); + + let result = UpdaterServer::check(&mut update_server, "ea".to_string()).await; + tracing::info!("Update check done: {result:?}"); + assert_eq!(result, UpdaterOutMessage::Ok); + + // giving it some time before ending + thread::sleep(Duration::from_secs(10)); + }) +} diff --git a/examples/updater/src/messages.rs b/examples/updater/src/messages.rs new file mode 100644 index 0000000..beed32d --- /dev/null +++ b/examples/updater/src/messages.rs @@ -0,0 +1,11 @@ +#[derive(Debug, Clone)] +pub enum UpdaterInMessage { + Check(String), +} + +#[allow(dead_code)] +#[derive(Debug, Clone, PartialEq)] +pub enum UpdaterOutMessage { + Ok, + Error, +} diff --git a/examples/updater/src/server.rs b/examples/updater/src/server.rs new file mode 100644 index 0000000..4bb907b --- /dev/null +++ b/examples/updater/src/server.rs @@ -0,0 +1,77 @@ +use std::{collections::HashMap, time::Duration}; + +use spawned_concurrency::{ + CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, send_after, +}; +use spawned_rt::mpsc::Sender; + +use crate::messages::{UpdaterInMessage as InMessage, UpdaterOutMessage as OutMessage}; + +type UpdateServerHandle = GenServerHandle; +type UpdateServerMessage = GenServerInMsg; +type UpdateServerState = HashMap; + +pub struct UpdaterServer {} + +impl UpdaterServer { + pub async fn check(server: &mut UpdateServerHandle, url: String) -> OutMessage { + match server.cast(InMessage::Check(url)).await { + Ok(_) => OutMessage::Ok, + Err(_) => OutMessage::Error, + } + } +} + +impl GenServer for UpdaterServer { + type InMsg = InMessage; + type OutMsg = OutMessage; + type Error = std::fmt::Error; + type State = UpdateServerState; + + fn new() -> Self { + Self {} + } + + fn initial_state(&self) -> Self::State { + HashMap::new() + } + + fn handle_call( + &mut self, + _message: InMessage, + _tx: &Sender, + _state: &mut Self::State, + ) -> CallResponse { + CallResponse::Reply(OutMessage::Ok) + } + + fn handle_cast( + &mut self, + message: InMessage, + tx: &Sender, + _state: &mut Self::State, + ) -> CastResponse { + match message { + Self::InMsg::Check(url) => { + send_after( + Duration::from_millis(1000), + tx.clone(), + InMessage::Check("url".to_string()), + ); + tracing::info!("Fetching: {url:?}"); + let resp = futures::executor::block_on(req()); + + tracing::info!("Response: {resp:?}"); + + CastResponse::NoReply + } + } + } +} + +async fn req() -> Result { + reqwest::get("https://httpbin.org/ip") + .await? + .text() + .await +} From 12bbe1eb369cd0ca7227f2e79a3c4c381ef89da9 Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Wed, 14 May 2025 12:35:31 -0300 Subject: [PATCH 05/15] WIP: refactoring to get sync and async beheaviors --- Cargo.lock | 1269 ++------------------- Cargo.toml | 5 +- concurrency/src/async/error.rs | 11 + concurrency/src/{ => async}/gen_server.rs | 4 +- concurrency/src/async/mod.rs | 7 + concurrency/src/{ => async}/process.rs | 2 +- concurrency/src/{ => async}/time.rs | 2 +- concurrency/src/error.rs | 11 - concurrency/src/lib.rs | 13 +- examples/bank-sync/Cargo.toml | 13 + examples/bank-sync/src/main.rs | 90 ++ examples/bank-sync/src/messages.rs | 25 + examples/bank-sync/src/server.rs | 113 ++ examples/bank/src/main.rs | 2 +- examples/ping_pong/Cargo.toml | 2 +- examples/updater/src/server.rs | 3 +- rt/Cargo.toml | 1 + rt/src/async/mod.rs | 24 + rt/src/{ => async}/tokio/mod.rs | 4 +- rt/src/{ => async}/tokio/mpsc.rs | 0 rt/src/{ => async}/tokio/oneshot.rs | 0 rt/src/lib.rs | 36 +- rt/src/sync/mod.rs | 15 + rt/src/sync/mpsc.rs | 5 + rt/src/sync/oneshot.rs | 3 + rt/src/tracing/mod.rs | 19 + 26 files changed, 451 insertions(+), 1228 deletions(-) create mode 100644 concurrency/src/async/error.rs rename concurrency/src/{ => async}/gen_server.rs (98%) create mode 100644 concurrency/src/async/mod.rs rename concurrency/src/{ => async}/process.rs (97%) rename concurrency/src/{ => async}/time.rs (87%) delete mode 100644 concurrency/src/error.rs create mode 100644 examples/bank-sync/Cargo.toml create mode 100644 examples/bank-sync/src/main.rs create mode 100644 examples/bank-sync/src/messages.rs create mode 100644 examples/bank-sync/src/server.rs create mode 100644 rt/src/async/mod.rs rename rt/src/{ => async}/tokio/mod.rs (64%) rename rt/src/{ => async}/tokio/mpsc.rs (100%) rename rt/src/{ => async}/tokio/oneshot.rs (100%) create mode 100644 rt/src/sync/mod.rs create mode 100644 rt/src/sync/mpsc.rs create mode 100644 rt/src/sync/oneshot.rs create mode 100644 rt/src/tracing/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 06f7b33..0aab1fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,17 +34,17 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", - "cfg-if", + "cfg-if 1.0.0", "libc", "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -57,16 +57,13 @@ dependencies = [ ] [[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +name = "bank-sync" +version = "0.1.0" +dependencies = [ + "spawned-concurrency", + "spawned-rt", + "tracing", +] [[package]] name = "bitflags" @@ -74,12 +71,6 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - [[package]] name = "bytes" version = "1.10.1" @@ -87,13 +78,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] -name = "cc" -version = "1.2.21" +name = "cfg-if" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" -dependencies = [ - "shlex", -] +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "cfg-if" @@ -102,192 +90,75 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.31" +name = "crossbeam" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "69323bff1fb41c635347b8ead484a5ca6c3f11914d784170b158d8449ab07f8e" dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", + "cfg-if 0.1.10", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", ] [[package]] -name = "futures-channel" -version = "0.3.31" +name = "crossbeam-channel" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" dependencies = [ - "futures-core", - "futures-sink", + "crossbeam-utils", + "maybe-uninit", ] [[package]] -name = "futures-core" -version = "0.3.31" +name = "crossbeam-deque" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed" dependencies = [ - "futures-core", - "futures-task", - "futures-util", + "crossbeam-epoch", + "crossbeam-utils", + "maybe-uninit", ] [[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" +name = "crossbeam-epoch" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ - "proc-macro2", - "quote", - "syn", + "autocfg", + "cfg-if 0.1.10", + "crossbeam-utils", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", ] [[package]] -name = "futures-sink" -version = "0.3.31" +name = "crossbeam-queue" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", + "cfg-if 0.1.10", + "crossbeam-utils", + "maybe-uninit", ] [[package]] -name = "getrandom" -version = "0.3.2" +name = "crossbeam-utils" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "autocfg", + "cfg-if 0.1.10", + "lazy_static", ] [[package]] @@ -296,241 +167,6 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - [[package]] name = "lazy_static" version = "1.5.0" @@ -539,21 +175,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.171" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "litemap" -version = "0.8.0" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "lock_api" @@ -580,6 +204,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + [[package]] name = "memchr" version = "2.7.4" @@ -587,16 +217,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] -name = "mime" -version = "0.3.17" +name = "memoffset" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +dependencies = [ + "autocfg", +] [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", ] @@ -608,43 +241,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "name_server" -version = "0.1.0" -dependencies = [ - "spawned-concurrency", - "spawned-rt", - "tracing", -] - -[[package]] -name = "name_server_with_error" -version = "0.1.0" -dependencies = [ - "spawned-concurrency", - "spawned-rt", - "tracing", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", + "wasi", + "windows-sys", ] [[package]] @@ -672,50 +270,6 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -[[package]] -name = "openssl" -version = "0.10.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" -dependencies = [ - "bitflags 2.9.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "overload" version = "0.1.1" @@ -738,55 +292,19 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - [[package]] name = "pin-project-lite" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "ping_pong" -version = "0.1.0" -dependencies = [ - "spawned-concurrency", - "spawned-rt", - "tracing", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "potential_utf" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" -dependencies = [ - "zerovec", -] - [[package]] name = "proc-macro2" version = "1.0.94" @@ -805,19 +323,13 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.9.0", + "bitflags", ] [[package]] @@ -864,167 +376,17 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - [[package]] name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustix" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" -dependencies = [ - "bitflags 2.9.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64", -] - -[[package]] -name = "rustversion" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.140" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] -name = "serde_urlencoded" -version = "0.7.1" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sharded-slab" @@ -1035,30 +397,15 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - [[package]] name = "smallvec" version = "1.14.0" @@ -1067,12 +414,12 @@ checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1087,17 +434,12 @@ dependencies = [ name = "spawned-rt" version = "0.1.0" dependencies = [ + "crossbeam", "tokio", "tracing", "tracing-subscriber", ] -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - [[package]] name = "syn" version = "2.0.100" @@ -1109,82 +451,21 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tempfile" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" -dependencies = [ - "fastrand", - "getrandom", - "once_cell", - "rustix", - "windows-sys 0.52.0", -] - [[package]] name = "thread_local" version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", ] -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "tokio" -version = "1.44.1" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", @@ -1195,7 +476,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1209,35 +490,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - [[package]] name = "tracing" version = "0.1.41" @@ -1300,163 +552,24 @@ dependencies = [ "tracing-log", ] -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" -[[package]] -name = "updater" -version = "0.1.0" -dependencies = [ - "futures", - "reqwest", - "spawned-concurrency", - "spawned-rt", - "tracing", -] - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "winapi" version = "0.3.9" @@ -1479,46 +592,13 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] @@ -1527,46 +607,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -1579,153 +641,26 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.0", -] - -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/Cargo.toml b/Cargo.toml index 1901a5c..d0e700b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,8 @@ [workspace] members = [ "rt", - "examples/ping_pong", - "examples/name_server", - "examples/name_server_with_error", "examples/bank", - "examples/updater", + "examples/bank-sync", ] [workspace.dependencies] diff --git a/concurrency/src/async/error.rs b/concurrency/src/async/error.rs new file mode 100644 index 0000000..b2ceff4 --- /dev/null +++ b/concurrency/src/async/error.rs @@ -0,0 +1,11 @@ +#[derive(Debug)] +pub enum GenServerError { + CallbackError, + ServerError, +} + +impl From> for GenServerError { + fn from(_value: spawned_rt::r#async::mpsc::SendError) -> Self { + Self::ServerError + } +} diff --git a/concurrency/src/gen_server.rs b/concurrency/src/async/gen_server.rs similarity index 98% rename from concurrency/src/gen_server.rs rename to concurrency/src/async/gen_server.rs index 11ec651..bfe3b0c 100644 --- a/concurrency/src/gen_server.rs +++ b/concurrency/src/async/gen_server.rs @@ -5,9 +5,9 @@ use std::{ panic::{AssertUnwindSafe, catch_unwind}, }; -use spawned_rt::{self as rt, JoinHandle, mpsc, oneshot}; +use spawned_rt::r#async::{self as rt, JoinHandle, mpsc, oneshot}; -use crate::error::GenServerError; +use crate::r#async::error::GenServerError; #[derive(Debug)] pub struct GenServerHandle { diff --git a/concurrency/src/async/mod.rs b/concurrency/src/async/mod.rs new file mode 100644 index 0000000..6cd41b3 --- /dev/null +++ b/concurrency/src/async/mod.rs @@ -0,0 +1,7 @@ +//! λ-kit concurrency +//! Some basic traits and structs to implement À-la-Erlang concurrent code. + +pub(crate) mod error; +pub(crate) mod gen_server; +pub(crate) mod process; +pub(crate) mod time; diff --git a/concurrency/src/process.rs b/concurrency/src/async/process.rs similarity index 97% rename from concurrency/src/process.rs rename to concurrency/src/async/process.rs index bbfc220..f3f433c 100644 --- a/concurrency/src/process.rs +++ b/concurrency/src/async/process.rs @@ -1,7 +1,7 @@ //! Process trait and struct to create a process abstraction similar to Erlang processes. //! See examples/ping_pong for a usage example. -use spawned_rt::{self as rt, JoinHandle, mpsc}; +use spawned_rt::r#async::{self as rt, JoinHandle, mpsc}; #[derive(Debug)] pub struct ProcessInfo { diff --git a/concurrency/src/time.rs b/concurrency/src/async/time.rs similarity index 87% rename from concurrency/src/time.rs rename to concurrency/src/async/time.rs index de8bb12..5b9b9dc 100644 --- a/concurrency/src/time.rs +++ b/concurrency/src/async/time.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use spawned_rt::{self as rt, mpsc::Sender, JoinHandle}; +use spawned_rt::r#async::{self as rt, mpsc::Sender, JoinHandle}; use crate::{GenServer, GenServerInMsg}; diff --git a/concurrency/src/error.rs b/concurrency/src/error.rs deleted file mode 100644 index a87f300..0000000 --- a/concurrency/src/error.rs +++ /dev/null @@ -1,11 +0,0 @@ -#[derive(Debug)] -pub enum GenServerError { - CallbackError, - ServerError, -} - -impl From> for GenServerError { - fn from(_value: spawned_rt::mpsc::SendError) -> Self { - Self::ServerError - } -} diff --git a/concurrency/src/lib.rs b/concurrency/src/lib.rs index ab6d8b0..a2b6408 100644 --- a/concurrency/src/lib.rs +++ b/concurrency/src/lib.rs @@ -1,12 +1,9 @@ //! λ-kit concurrency //! Some basic traits and structs to implement À-la-Erlang concurrent code. -mod error; -mod gen_server; -mod process; -mod time; +mod r#async; -pub use error::GenServerError; -pub use gen_server::{CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg}; -pub use process::{Process, ProcessInfo, send}; -pub use time::send_after; +pub use r#async::error::GenServerError; +pub use r#async::gen_server::{CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg}; +pub use r#async::process::{Process, ProcessInfo, send}; +pub use r#async::time::send_after; diff --git a/examples/bank-sync/Cargo.toml b/examples/bank-sync/Cargo.toml new file mode 100644 index 0000000..3903760 --- /dev/null +++ b/examples/bank-sync/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "bank-sync" +version = "0.1.0" +edition = "2024" + +[dependencies] +spawned-rt = { workspace = true } +spawned-concurrency = { workspace = true } +tracing = { workspace = true } + +[[bin]] +name = "bank-sync" +path = "src/main.rs" \ No newline at end of file diff --git a/examples/bank-sync/src/main.rs b/examples/bank-sync/src/main.rs new file mode 100644 index 0000000..3a254c3 --- /dev/null +++ b/examples/bank-sync/src/main.rs @@ -0,0 +1,90 @@ +//! Simple example to test concurrency/Process abstraction. +//! +//! Based on Joe's Armstrong book: Programming Erlang, Second edition +//! Section 22.1 - The Road to the Generic Server +//! +//! Erlang usage example: +//! 1> my_bank:start(). +//! {ok,<0.33.0>} +//! 2> my_bank:deposit("joe", 10). +//! not_a_customer +//! 3> my_bank:new_account("joe"). +//! {welcome,"joe"} +//! 4> my_bank:deposit("joe", 10). +//! {thanks,"joe",your_balance_is,10} +//! 5> my_bank:deposit("joe", 30). +//! {thanks,"joe",your_balance_is,40} +//! 6> my_bank:withdraw("joe", 15). +//! {thanks,"joe",your_balance_is,25} +//! 7> my_bank:withdraw("joe", 45). +//! {sorry,"joe",you_only_have,25,in_the_bank + +mod messages; +mod server; + +use messages::{BankError, BankOutMessage}; +use server::Bank; +use spawned_concurrency::GenServer as _; +use spawned_rt as rt; + +fn main() { + rt::sync::run(execution); +} + +fn execution() { + let mut name_server = Bank::start(); + + let joe = "Joe".to_string(); + + let result = Bank::deposit(&mut name_server, joe.clone(), 10); + tracing::info!("Deposit result {result:?}"); + assert_eq!(result, Err(BankError::NotACustomer { who: joe.clone() })); + + let result = Bank::new_account(&mut name_server, "Joe".to_string()); + tracing::info!("New account result {result:?}"); + assert_eq!(result, Ok(BankOutMessage::Welcome { who: joe.clone() })); + + let result = Bank::deposit(&mut name_server, "Joe".to_string(), 10); + tracing::info!("Deposit result {result:?}"); + assert_eq!( + result, + Ok(BankOutMessage::Balance { + who: joe.clone(), + amount: 10 + }) + ); + + let result = Bank::deposit(&mut name_server, "Joe".to_string(), 30); + tracing::info!("Deposit result {result:?}"); + assert_eq!( + result, + Ok(BankOutMessage::Balance { + who: joe.clone(), + amount: 40 + }) + ); + + let result = Bank::withdraw(&mut name_server, "Joe".to_string(), 15); + tracing::info!("Withdraw result {result:?}"); + assert_eq!( + result, + Ok(BankOutMessage::WidrawOk { + who: joe.clone(), + amount: 25 + }) + ); + + let result = Bank::withdraw(&mut name_server, "Joe".to_string(), 45); + tracing::info!("Withdraw result {result:?}"); + assert_eq!( + result, + Err(BankError::InsufficientBalance { + who: joe, + amount: 25 + }) + ); + + let result = Bank::stop(&mut name_server); + tracing::info!("Stop result {result:?}"); + assert_eq!(result, Ok(BankOutMessage::Stopped)); +} \ No newline at end of file diff --git a/examples/bank-sync/src/messages.rs b/examples/bank-sync/src/messages.rs new file mode 100644 index 0000000..d58ae9d --- /dev/null +++ b/examples/bank-sync/src/messages.rs @@ -0,0 +1,25 @@ +#[derive(Debug, Clone)] +pub enum BankInMessage { + New { who: String }, + Add { who: String, amount: i32 }, + Remove { who: String, amount: i32 }, + Stop, +} + +#[allow(dead_code)] +#[derive(Debug, Clone, PartialEq)] +pub enum BankOutMessage { + Welcome { who: String }, + Balance { who: String, amount: i32 }, + WidrawOk { who: String, amount: i32 }, + Stopped, +} + +#[allow(dead_code)] +#[derive(Debug, Clone, PartialEq)] +pub enum BankError { + AlreadyACustomer { who: String }, + NotACustomer { who: String }, + InsufficientBalance { who: String, amount: i32 }, + ServerError, +} diff --git a/examples/bank-sync/src/server.rs b/examples/bank-sync/src/server.rs new file mode 100644 index 0000000..44fe376 --- /dev/null +++ b/examples/bank-sync/src/server.rs @@ -0,0 +1,113 @@ +use std::collections::HashMap; + +use spawned_concurrency::{CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg}; +use spawned_rt::mpsc::Sender; + +use crate::messages::{BankError, BankInMessage as InMessage, BankOutMessage as OutMessage}; + +type MsgResult = Result; +type BankHandle = GenServerHandle; +type BankHandleMessage = GenServerInMsg; +type BankState = HashMap; + +pub struct Bank {} + +impl Bank { + pub async fn stop(server: &mut BankHandle) -> MsgResult { + server + .call(InMessage::Stop) + .await + .unwrap_or(Err(BankError::ServerError)) + } + + pub async fn new_account(server: &mut BankHandle, who: String) -> MsgResult { + server + .call(InMessage::New { who }) + .await + .unwrap_or(Err(BankError::ServerError)) + } + + pub async fn deposit(server: &mut BankHandle, who: String, amount: i32) -> MsgResult { + server + .call(InMessage::Add { who, amount }) + .await + .unwrap_or(Err(BankError::ServerError)) + } + + pub async fn withdraw(server: &mut BankHandle, who: String, amount: i32) -> MsgResult { + server + .call(InMessage::Remove { who, amount }) + .await + .unwrap_or(Err(BankError::ServerError)) + } +} + +impl GenServer for Bank { + type InMsg = InMessage; + type OutMsg = MsgResult; + type Error = BankError; + type State = BankState; + + fn initial_state(&self) -> Self::State { + HashMap::new() + } + + fn new() -> Self { + Self {} + } + + fn handle_call( + &mut self, + message: InMessage, + _tx: &Sender, + state: &mut Self::State, + ) -> CallResponse { + match message.clone() { + InMessage::New { who } => match state.get(&who) { + Some(_amount) => CallResponse::Reply(Err(BankError::AlreadyACustomer { who })), + None => { + state.insert(who.clone(), 0); + CallResponse::Reply(Ok(OutMessage::Welcome { who })) + } + }, + InMessage::Add { who, amount } => match state.get(&who) { + Some(current) => { + let new_amount = current + amount; + state.insert(who.clone(), new_amount); + CallResponse::Reply(Ok(OutMessage::Balance { + who, + amount: new_amount, + })) + } + None => CallResponse::Reply(Err(BankError::NotACustomer { who })), + }, + InMessage::Remove { who, amount } => match state.get(&who) { + Some(current) => match current < &amount { + true => CallResponse::Reply(Err(BankError::InsufficientBalance { + who, + amount: *current, + })), + false => { + let new_amount = current - amount; + state.insert(who.clone(), new_amount); + CallResponse::Reply(Ok(OutMessage::WidrawOk { + who, + amount: new_amount, + })) + } + }, + None => CallResponse::Reply(Err(BankError::NotACustomer { who })), + }, + InMessage::Stop => CallResponse::Stop(Ok(OutMessage::Stopped)), + } + } + + fn handle_cast( + &mut self, + _message: InMessage, + _tx: &Sender, + _state: &mut Self::State, + ) -> CastResponse { + CastResponse::NoReply + } +} diff --git a/examples/bank/src/main.rs b/examples/bank/src/main.rs index 54f7275..f161498 100644 --- a/examples/bank/src/main.rs +++ b/examples/bank/src/main.rs @@ -28,7 +28,7 @@ use spawned_concurrency::GenServer as _; use spawned_rt as rt; fn main() { - rt::run(async { + rt::r#async::run(async { let mut name_server = Bank::start(); let joe = "Joe".to_string(); diff --git a/examples/ping_pong/Cargo.toml b/examples/ping_pong/Cargo.toml index 71105a3..9cbc292 100644 --- a/examples/ping_pong/Cargo.toml +++ b/examples/ping_pong/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2024" [dependencies] -spawned-rt = { workspace = true } +spawned-rt-sync = { workspace = true } spawned-concurrency = { workspace = true } tracing = { workspace = true } diff --git a/examples/updater/src/server.rs b/examples/updater/src/server.rs index 4bb907b..68542f5 100644 --- a/examples/updater/src/server.rs +++ b/examples/updater/src/server.rs @@ -59,8 +59,9 @@ impl GenServer for UpdaterServer { InMessage::Check("url".to_string()), ); tracing::info!("Fetching: {url:?}"); + //let enter = futures::executor::enter(); let resp = futures::executor::block_on(req()); - + //drop(enter); tracing::info!("Response: {resp:?}"); CastResponse::NoReply diff --git a/rt/Cargo.toml b/rt/Cargo.toml index 7c455d8..c2d595b 100644 --- a/rt/Cargo.toml +++ b/rt/Cargo.toml @@ -5,5 +5,6 @@ edition = "2024" [dependencies] tokio = { version = "1", features = ["full"] } +crossbeam = { version = "0.7.3" } tracing = { workspace = true } tracing-subscriber = { workspace = true } \ No newline at end of file diff --git a/rt/src/async/mod.rs b/rt/src/async/mod.rs new file mode 100644 index 0000000..c25175a --- /dev/null +++ b/rt/src/async/mod.rs @@ -0,0 +1,24 @@ +//! Runtime wrapper to remove dependencies from code. Using this library will +//! allow to set a tokio runtime or any other runtime, once implemented just by +//! changing the enabled feature. +//! May implement the `deterministic` version based on comonware.xyz's runtime: +//! https://github.com/commonwarexyz/monorepo/blob/main/runtime/src/deterministic.rs +//! +//! Currently, only a very limited set of tokio functionality is reexported. We may want to +//! extend this functionality as needed. + +mod tokio; + +use crate::tracing::init_tracing; + +pub use crate::r#async::tokio::mpsc; +pub use crate::r#async::tokio::sleep; +pub use crate::r#async::tokio::oneshot; +pub use crate::r#async::tokio::{JoinHandle, Runtime, Handle, spawn, spawn_blocking}; + +pub fn run(future: F) -> F::Output { + init_tracing(); + + let rt = Runtime::new().unwrap(); + rt.block_on(future) +} diff --git a/rt/src/tokio/mod.rs b/rt/src/async/tokio/mod.rs similarity index 64% rename from rt/src/tokio/mod.rs rename to rt/src/async/tokio/mod.rs index 030d282..09cc804 100644 --- a/rt/src/tokio/mod.rs +++ b/rt/src/async/tokio/mod.rs @@ -4,6 +4,6 @@ pub mod oneshot; pub use tokio::{ time::sleep, - runtime::Runtime, - task::{JoinHandle, spawn}, + runtime::{Runtime, Handle}, + task::{JoinHandle, spawn, spawn_blocking}, }; diff --git a/rt/src/tokio/mpsc.rs b/rt/src/async/tokio/mpsc.rs similarity index 100% rename from rt/src/tokio/mpsc.rs rename to rt/src/async/tokio/mpsc.rs diff --git a/rt/src/tokio/oneshot.rs b/rt/src/async/tokio/oneshot.rs similarity index 100% rename from rt/src/tokio/oneshot.rs rename to rt/src/async/tokio/oneshot.rs diff --git a/rt/src/lib.rs b/rt/src/lib.rs index 19c0126..0a45042 100644 --- a/rt/src/lib.rs +++ b/rt/src/lib.rs @@ -7,33 +7,11 @@ //! Currently, only a very limited set of tokio functionality is reexported. We may want to //! extend this functionality as needed. -mod tokio; +mod tracing; +pub mod sync; +pub mod r#async; -use std::str::FromStr; - -use tracing_subscriber::EnvFilter; -use tracing_subscriber::FmtSubscriber; -use tracing_subscriber::filter::Directive; - -pub use crate::tokio::mpsc; -pub use crate::tokio::sleep; -pub use crate::tokio::oneshot; -pub use crate::tokio::{JoinHandle, Runtime, spawn}; - -pub fn run(future: F) -> F::Output { - init_tracing(); - - let rt = Runtime::new().unwrap(); - rt.block_on(future) -} - -fn init_tracing() { - let subscriber = FmtSubscriber::builder() - .with_env_filter( - EnvFilter::builder() - .with_default_directive(Directive::from_str("info").unwrap()) - .from_env_lossy(), - ) - .finish(); - tracing::subscriber::set_global_default(subscriber).unwrap(); -} +pub use crate::r#async::mpsc; +pub use crate::sync::sleep; +pub use crate::sync::oneshot; +pub use crate::sync::spawn; diff --git a/rt/src/sync/mod.rs b/rt/src/sync/mod.rs new file mode 100644 index 0000000..3ffa1e2 --- /dev/null +++ b/rt/src/sync/mod.rs @@ -0,0 +1,15 @@ +pub mod mpsc; +pub mod oneshot; + +pub use std::thread::{ + sleep, + spawn, +}; + +use crate::tracing::init_tracing; + +pub fn run(f: fn()) -> () { + init_tracing(); + + f() +} \ No newline at end of file diff --git a/rt/src/sync/mpsc.rs b/rt/src/sync/mpsc.rs new file mode 100644 index 0000000..2d7065b --- /dev/null +++ b/rt/src/sync/mpsc.rs @@ -0,0 +1,5 @@ +//! Tokio.rs reexports to prevent tokio dependencies within external code + +pub use std::sync::mpsc::{ + Receiver, Sender, channel, +}; diff --git a/rt/src/sync/oneshot.rs b/rt/src/sync/oneshot.rs new file mode 100644 index 0000000..352c546 --- /dev/null +++ b/rt/src/sync/oneshot.rs @@ -0,0 +1,3 @@ +//! Tokio.rs reexports to prevent tokio dependencies within external code + +pub use crossbeam::{Receiver, Sender, crossbeam_channel as channel}; diff --git a/rt/src/tracing/mod.rs b/rt/src/tracing/mod.rs new file mode 100644 index 0000000..93886b5 --- /dev/null +++ b/rt/src/tracing/mod.rs @@ -0,0 +1,19 @@ +//! Tracing initializer +//! + +use std::str::FromStr; + +use tracing_subscriber::EnvFilter; +use tracing_subscriber::FmtSubscriber; +use tracing_subscriber::filter::Directive; + +pub(crate) fn init_tracing() { + let subscriber = FmtSubscriber::builder() + .with_env_filter( + EnvFilter::builder() + .with_default_directive(Directive::from_str("info").unwrap()) + .from_env_lossy(), + ) + .finish(); + tracing::subscriber::set_global_default(subscriber).unwrap(); +} From fe98c0042d159ae9629ab6233ef6f5bb52736257 Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Wed, 14 May 2025 15:22:07 -0300 Subject: [PATCH 06/15] Using url parameter and some formatting --- concurrency/src/gen_server.rs | 15 +++++++++------ concurrency/src/time.rs | 8 +++----- examples/updater/src/main.rs | 5 +++-- examples/updater/src/server.rs | 13 +++++-------- rt/src/lib.rs | 2 +- rt/src/tokio/mod.rs | 2 +- 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/concurrency/src/gen_server.rs b/concurrency/src/gen_server.rs index 4d84f19..e353be0 100644 --- a/concurrency/src/gen_server.rs +++ b/concurrency/src/gen_server.rs @@ -1,11 +1,8 @@ //! GernServer trait and structs to create an abstraction similar to Erlang gen_server. //! See examples/name_server for a usage example. -use std::{ - fmt::Debug, - panic::AssertUnwindSafe, -}; use futures::future::FutureExt as _; use spawned_rt::{self as rt, JoinHandle, mpsc, oneshot}; +use std::{fmt::Debug, panic::AssertUnwindSafe}; use crate::error::GenServerError; @@ -136,7 +133,10 @@ where let (keep_running, error) = match message { Some(GenServerInMsg::Call { sender, message }) => { let (keep_running, error, response) = - match AssertUnwindSafe(self.handle_call(message, tx, state)).catch_unwind().await { + match AssertUnwindSafe(self.handle_call(message, tx, state)) + .catch_unwind() + .await + { Ok(response) => match response { CallResponse::Reply(response) => (true, None, Ok(response)), CallResponse::Stop(response) => (false, None, Ok(response)), @@ -152,7 +152,10 @@ where (keep_running, error) } Some(GenServerInMsg::Cast { message }) => { - match AssertUnwindSafe(self.handle_cast(message, tx, state)).catch_unwind().await { + match AssertUnwindSafe(self.handle_cast(message, tx, state)) + .catch_unwind() + .await + { Ok(response) => match response { CastResponse::NoReply => (true, None), CastResponse::Stop => (false, None), diff --git a/concurrency/src/time.rs b/concurrency/src/time.rs index de8bb12..be1e2a3 100644 --- a/concurrency/src/time.rs +++ b/concurrency/src/time.rs @@ -1,11 +1,9 @@ use std::time::Duration; -use spawned_rt::{self as rt, mpsc::Sender, JoinHandle}; +use spawned_rt::{self as rt, JoinHandle, mpsc::Sender}; use crate::{GenServer, GenServerInMsg}; - - // Sends a message after a given period to the specified GenServer. The task terminates // once the send has completed pub fn send_after( @@ -18,6 +16,6 @@ where { rt::spawn(async move { rt::sleep(period).await; - let _ = tx.send(GenServerInMsg::Cast { message } ); + let _ = tx.send(GenServerInMsg::Cast { message }); }) -} \ No newline at end of file +} diff --git a/examples/updater/src/main.rs b/examples/updater/src/main.rs index a51906b..c94ec68 100644 --- a/examples/updater/src/main.rs +++ b/examples/updater/src/main.rs @@ -1,7 +1,7 @@ //! Example to test a recurrent gen_server. //! //! Just activates periodically and performs an http request -//! +//! mod messages; mod server; @@ -17,7 +17,8 @@ fn main() { rt::run(async { let mut update_server = UpdaterServer::start(); - let result = UpdaterServer::check(&mut update_server, "ea".to_string()).await; + let result = + UpdaterServer::check(&mut update_server, "https://httpbin.org/ip".to_string()).await; tracing::info!("Update check done: {result:?}"); assert_eq!(result, UpdaterOutMessage::Ok); diff --git a/examples/updater/src/server.rs b/examples/updater/src/server.rs index a362c27..ee68bb4 100644 --- a/examples/updater/src/server.rs +++ b/examples/updater/src/server.rs @@ -56,10 +56,10 @@ impl GenServer for UpdaterServer { send_after( Duration::from_millis(1000), tx.clone(), - InMessage::Check("url".to_string()), + InMessage::Check(url.clone()), ); - tracing::info!("Fetching: {url:?}"); - let resp = req().await; + tracing::info!("Fetching: {url}"); + let resp = req(url).await; tracing::info!("Response: {resp:?}"); @@ -69,9 +69,6 @@ impl GenServer for UpdaterServer { } } -async fn req() -> Result { - reqwest::get("https://httpbin.org/ip") - .await? - .text() - .await +async fn req(url: String) -> Result { + reqwest::get(url).await?.text().await } diff --git a/rt/src/lib.rs b/rt/src/lib.rs index 19c0126..347f81f 100644 --- a/rt/src/lib.rs +++ b/rt/src/lib.rs @@ -16,8 +16,8 @@ use tracing_subscriber::FmtSubscriber; use tracing_subscriber::filter::Directive; pub use crate::tokio::mpsc; -pub use crate::tokio::sleep; pub use crate::tokio::oneshot; +pub use crate::tokio::sleep; pub use crate::tokio::{JoinHandle, Runtime, spawn}; pub fn run(future: F) -> F::Output { diff --git a/rt/src/tokio/mod.rs b/rt/src/tokio/mod.rs index 030d282..0ad2c20 100644 --- a/rt/src/tokio/mod.rs +++ b/rt/src/tokio/mod.rs @@ -3,7 +3,7 @@ pub mod mpsc; pub mod oneshot; pub use tokio::{ - time::sleep, runtime::Runtime, task::{JoinHandle, spawn}, + time::sleep, }; From 05f66b44e7503e0ffb743fbe92f260821c19f62d Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Thu, 15 May 2025 11:43:07 -0300 Subject: [PATCH 07/15] removed initial_state from trait and replaced it by providing state at start --- concurrency/Cargo.toml | 5 +++- concurrency/src/gen_server.rs | 11 +++----- examples/bank/src/main.rs | 4 ++- examples/bank/src/server.rs | 4 --- examples/name_server/src/main.rs | 4 ++- examples/name_server/src/server.rs | 4 --- examples/name_server_with_error/src/main.rs | 4 ++- examples/name_server_with_error/src/server.rs | 4 --- examples/updater/src/main.rs | 10 ++++--- examples/updater/src/messages.rs | 2 +- examples/updater/src/server.rs | 27 +++++++++---------- rt/Cargo.toml | 5 +++- 12 files changed, 40 insertions(+), 44 deletions(-) diff --git a/concurrency/Cargo.toml b/concurrency/Cargo.toml index 7e9f20c..cfbf997 100644 --- a/concurrency/Cargo.toml +++ b/concurrency/Cargo.toml @@ -6,4 +6,7 @@ edition = "2024" [dependencies] spawned-rt = { workspace = true } tracing = { workspace = true } -futures = "0.3.1" \ No newline at end of file +futures = "0.3.1" + +[lib] +path = "./src/lib.rs" \ No newline at end of file diff --git a/concurrency/src/gen_server.rs b/concurrency/src/gen_server.rs index e353be0..685cccd 100644 --- a/concurrency/src/gen_server.rs +++ b/concurrency/src/gen_server.rs @@ -14,14 +14,13 @@ pub struct GenServerHandle { } impl GenServerHandle { - pub(crate) fn new() -> Self { + pub(crate) fn new(mut initial_state: G::State) -> Self { let (tx, mut rx) = mpsc::channel::>(); let tx_clone = tx.clone(); let mut gen_server: G = GenServer::new(); - let mut state = gen_server.initial_state(); let handle = rt::spawn(async move { if gen_server - .run(&tx_clone, &mut rx, &mut state) + .run(&tx_clone, &mut rx, &mut initial_state) .await .is_err() { @@ -85,8 +84,8 @@ where fn new() -> Self; - fn start() -> GenServerHandle { - GenServerHandle::new() + fn start(initial_state: Self::State) -> GenServerHandle { + GenServerHandle::new(initial_state) } fn run( @@ -177,8 +176,6 @@ where } } - fn initial_state(&self) -> Self::State; - fn handle_call( &mut self, message: Self::InMsg, diff --git a/examples/bank/src/main.rs b/examples/bank/src/main.rs index 54f7275..db6e7a0 100644 --- a/examples/bank/src/main.rs +++ b/examples/bank/src/main.rs @@ -22,6 +22,8 @@ mod messages; mod server; +use std::collections::HashMap; + use messages::{BankError, BankOutMessage}; use server::Bank; use spawned_concurrency::GenServer as _; @@ -29,7 +31,7 @@ use spawned_rt as rt; fn main() { rt::run(async { - let mut name_server = Bank::start(); + let mut name_server = Bank::start(HashMap::new()); let joe = "Joe".to_string(); diff --git a/examples/bank/src/server.rs b/examples/bank/src/server.rs index feab27a..d5e43bc 100644 --- a/examples/bank/src/server.rs +++ b/examples/bank/src/server.rs @@ -48,10 +48,6 @@ impl GenServer for Bank { type Error = BankError; type State = BankState; - fn initial_state(&self) -> Self::State { - HashMap::new() - } - fn new() -> Self { Self {} } diff --git a/examples/name_server/src/main.rs b/examples/name_server/src/main.rs index 7acd3e0..8eb69d8 100644 --- a/examples/name_server/src/main.rs +++ b/examples/name_server/src/main.rs @@ -14,6 +14,8 @@ mod messages; mod server; +use std::collections::HashMap; + use messages::NameServerOutMessage; use server::NameServer; use spawned_concurrency::GenServer as _; @@ -21,7 +23,7 @@ use spawned_rt as rt; fn main() { rt::run(async { - let mut name_server = NameServer::start(); + let mut name_server = NameServer::start(HashMap::new()); let result = NameServer::add(&mut name_server, "Joe".to_string(), "At Home".to_string()).await; diff --git a/examples/name_server/src/server.rs b/examples/name_server/src/server.rs index 4a2671f..d282251 100644 --- a/examples/name_server/src/server.rs +++ b/examples/name_server/src/server.rs @@ -37,10 +37,6 @@ impl GenServer for NameServer { Self {} } - fn initial_state(&self) -> Self::State { - HashMap::new() - } - async fn handle_call( &mut self, message: InMessage, diff --git a/examples/name_server_with_error/src/main.rs b/examples/name_server_with_error/src/main.rs index f8329c0..ae4aae2 100644 --- a/examples/name_server_with_error/src/main.rs +++ b/examples/name_server_with_error/src/main.rs @@ -14,6 +14,8 @@ mod messages; mod server; +use std::collections::HashMap; + use messages::NameServerOutMessage; use server::NameServer; use spawned_concurrency::GenServer as _; @@ -21,7 +23,7 @@ use spawned_rt as rt; fn main() { rt::run(async { - let mut name_server = NameServer::start(); + let mut name_server = NameServer::start(HashMap::new()); let result = NameServer::add(&mut name_server, "Joe".to_string(), "At Home".to_string()).await; diff --git a/examples/name_server_with_error/src/server.rs b/examples/name_server_with_error/src/server.rs index c1dcbf5..134c7c8 100644 --- a/examples/name_server_with_error/src/server.rs +++ b/examples/name_server_with_error/src/server.rs @@ -36,10 +36,6 @@ impl GenServer for NameServer { type Error = std::fmt::Error; type State = NameServerState; - fn initial_state(&self) -> NameServerState { - HashMap::new() - } - fn new() -> Self { NameServer {} } diff --git a/examples/updater/src/main.rs b/examples/updater/src/main.rs index c94ec68..4b3aa50 100644 --- a/examples/updater/src/main.rs +++ b/examples/updater/src/main.rs @@ -9,16 +9,18 @@ mod server; use std::{thread, time::Duration}; use messages::UpdaterOutMessage; -use server::UpdaterServer; +use server::{UpdateServerState, UpdaterServer}; use spawned_concurrency::GenServer as _; use spawned_rt as rt; fn main() { rt::run(async { - let mut update_server = UpdaterServer::start(); + let mut update_server = UpdaterServer::start(UpdateServerState { + url: "https://httpbin.org/ip".to_string(), + periodicity: Duration::from_millis(1000), + }); - let result = - UpdaterServer::check(&mut update_server, "https://httpbin.org/ip".to_string()).await; + let result = UpdaterServer::check(&mut update_server).await; tracing::info!("Update check done: {result:?}"); assert_eq!(result, UpdaterOutMessage::Ok); diff --git a/examples/updater/src/messages.rs b/examples/updater/src/messages.rs index beed32d..daa0589 100644 --- a/examples/updater/src/messages.rs +++ b/examples/updater/src/messages.rs @@ -1,6 +1,6 @@ #[derive(Debug, Clone)] pub enum UpdaterInMessage { - Check(String), + Check, } #[allow(dead_code)] diff --git a/examples/updater/src/server.rs b/examples/updater/src/server.rs index ee68bb4..31e817e 100644 --- a/examples/updater/src/server.rs +++ b/examples/updater/src/server.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, time::Duration}; +use std::time::Duration; use spawned_concurrency::{ CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, send_after, @@ -9,13 +9,17 @@ use crate::messages::{UpdaterInMessage as InMessage, UpdaterOutMessage as OutMes type UpdateServerHandle = GenServerHandle; type UpdateServerMessage = GenServerInMsg; -type UpdateServerState = HashMap; +#[derive(Clone)] +pub struct UpdateServerState { + pub url: String, + pub periodicity: Duration, +} pub struct UpdaterServer {} impl UpdaterServer { - pub async fn check(server: &mut UpdateServerHandle, url: String) -> OutMessage { - match server.cast(InMessage::Check(url)).await { + pub async fn check(server: &mut UpdateServerHandle) -> OutMessage { + match server.cast(InMessage::Check).await { Ok(_) => OutMessage::Ok, Err(_) => OutMessage::Error, } @@ -32,10 +36,6 @@ impl GenServer for UpdaterServer { Self {} } - fn initial_state(&self) -> Self::State { - HashMap::new() - } - async fn handle_call( &mut self, _message: InMessage, @@ -49,15 +49,12 @@ impl GenServer for UpdaterServer { &mut self, message: InMessage, tx: &Sender, - _state: &mut Self::State, + state: &mut Self::State, ) -> CastResponse { match message { - Self::InMsg::Check(url) => { - send_after( - Duration::from_millis(1000), - tx.clone(), - InMessage::Check(url.clone()), - ); + Self::InMsg::Check => { + send_after(state.periodicity, tx.clone(), InMessage::Check); + let url = state.url.clone(); tracing::info!("Fetching: {url}"); let resp = req(url).await; diff --git a/rt/Cargo.toml b/rt/Cargo.toml index 7c455d8..679ba98 100644 --- a/rt/Cargo.toml +++ b/rt/Cargo.toml @@ -6,4 +6,7 @@ edition = "2024" [dependencies] tokio = { version = "1", features = ["full"] } tracing = { workspace = true } -tracing-subscriber = { workspace = true } \ No newline at end of file +tracing-subscriber = { workspace = true } + +[lib] +path = "./src/lib.rs" \ No newline at end of file From 07881413fa162600bfe0a9c663843b386a76d5ea Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Thu, 15 May 2025 14:39:34 -0300 Subject: [PATCH 08/15] cargo fmt --- concurrency/src/async/time.rs | 8 +++----- concurrency/src/lib.rs | 4 +++- examples/bank-sync/src/main.rs | 2 +- rt/src/async/mod.rs | 2 +- rt/src/lib.rs | 6 +++--- rt/src/sync/mod.rs | 7 ++----- rt/src/sync/mpsc.rs | 4 +--- rt/src/tracing/mod.rs | 2 +- 8 files changed, 15 insertions(+), 20 deletions(-) diff --git a/concurrency/src/async/time.rs b/concurrency/src/async/time.rs index 5b9b9dc..a85392f 100644 --- a/concurrency/src/async/time.rs +++ b/concurrency/src/async/time.rs @@ -1,11 +1,9 @@ use std::time::Duration; -use spawned_rt::r#async::{self as rt, mpsc::Sender, JoinHandle}; +use spawned_rt::r#async::{self as rt, JoinHandle, mpsc::Sender}; use crate::{GenServer, GenServerInMsg}; - - // Sends a message after a given period to the specified GenServer. The task terminates // once the send has completed pub fn send_after( @@ -18,6 +16,6 @@ where { rt::spawn(async move { rt::sleep(period).await; - let _ = tx.send(GenServerInMsg::Cast { message } ); + let _ = tx.send(GenServerInMsg::Cast { message }); }) -} \ No newline at end of file +} diff --git a/concurrency/src/lib.rs b/concurrency/src/lib.rs index a2b6408..2345086 100644 --- a/concurrency/src/lib.rs +++ b/concurrency/src/lib.rs @@ -4,6 +4,8 @@ mod r#async; pub use r#async::error::GenServerError; -pub use r#async::gen_server::{CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg}; +pub use r#async::gen_server::{ + CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, +}; pub use r#async::process::{Process, ProcessInfo, send}; pub use r#async::time::send_after; diff --git a/examples/bank-sync/src/main.rs b/examples/bank-sync/src/main.rs index 3a254c3..b8ef9cd 100644 --- a/examples/bank-sync/src/main.rs +++ b/examples/bank-sync/src/main.rs @@ -87,4 +87,4 @@ fn execution() { let result = Bank::stop(&mut name_server); tracing::info!("Stop result {result:?}"); assert_eq!(result, Ok(BankOutMessage::Stopped)); -} \ No newline at end of file +} diff --git a/rt/src/async/mod.rs b/rt/src/async/mod.rs index 8a3f8d1..a582b05 100644 --- a/rt/src/async/mod.rs +++ b/rt/src/async/mod.rs @@ -12,8 +12,8 @@ mod tokio; use crate::tracing::init_tracing; pub use crate::r#async::tokio::mpsc; -pub use crate::r#async::tokio::sleep; pub use crate::r#async::tokio::oneshot; +pub use crate::r#async::tokio::sleep; pub use crate::r#async::tokio::{JoinHandle, Runtime, spawn}; pub fn run(future: F) -> F::Output { diff --git a/rt/src/lib.rs b/rt/src/lib.rs index b8071ca..5f383c7 100644 --- a/rt/src/lib.rs +++ b/rt/src/lib.rs @@ -7,11 +7,11 @@ //! Currently, only a very limited set of tokio functionality is reexported. We may want to //! extend this functionality as needed. -mod tracing; -pub mod sync; pub mod r#async; +pub mod sync; +mod tracing; pub use crate::sync::mpsc; -pub use crate::sync::sleep; pub use crate::sync::oneshot; +pub use crate::sync::sleep; pub use crate::sync::spawn; diff --git a/rt/src/sync/mod.rs b/rt/src/sync/mod.rs index 3ffa1e2..c07e103 100644 --- a/rt/src/sync/mod.rs +++ b/rt/src/sync/mod.rs @@ -1,10 +1,7 @@ pub mod mpsc; pub mod oneshot; -pub use std::thread::{ - sleep, - spawn, -}; +pub use std::thread::{sleep, spawn}; use crate::tracing::init_tracing; @@ -12,4 +9,4 @@ pub fn run(f: fn()) -> () { init_tracing(); f() -} \ No newline at end of file +} diff --git a/rt/src/sync/mpsc.rs b/rt/src/sync/mpsc.rs index 2d7065b..fb8fda2 100644 --- a/rt/src/sync/mpsc.rs +++ b/rt/src/sync/mpsc.rs @@ -1,5 +1,3 @@ //! Tokio.rs reexports to prevent tokio dependencies within external code -pub use std::sync::mpsc::{ - Receiver, Sender, channel, -}; +pub use std::sync::mpsc::{Receiver, Sender, channel}; diff --git a/rt/src/tracing/mod.rs b/rt/src/tracing/mod.rs index 93886b5..dde973f 100644 --- a/rt/src/tracing/mod.rs +++ b/rt/src/tracing/mod.rs @@ -1,5 +1,5 @@ //! Tracing initializer -//! +//! use std::str::FromStr; From a30dfd8165617b8fa84b897b66f6b0f4ed9fabca Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Thu, 15 May 2025 17:42:27 -0300 Subject: [PATCH 09/15] Added sync (std::thead::spawn) version with examples --- Cargo.lock | 1105 ++++++++++++++++- Cargo.toml | 7 +- concurrency/src/async/gen_server.rs | 2 +- concurrency/src/async/mod.rs | 13 +- concurrency/src/async/time.rs | 2 +- concurrency/src/lib.rs | 10 +- concurrency/src/sync/error.rs | 11 + concurrency/src/sync/gen_server.rs | 179 +++ concurrency/src/sync/mod.rs | 11 + concurrency/src/sync/process.rs | 71 ++ concurrency/src/sync/time.rs | 21 + examples/bank-sync/src/main.rs | 90 -- examples/bank/src/main.rs | 6 +- examples/bank/src/server.rs | 4 +- examples/{bank-sync => bank_sync}/Cargo.toml | 4 +- examples/bank_sync/src/main.rs | 90 ++ .../{bank-sync => bank_sync}/src/messages.rs | 0 .../{bank-sync => bank_sync}/src/server.rs | 22 +- examples/name_server/src/main.rs | 4 +- examples/name_server/src/server.rs | 6 +- examples/name_server_with_error/src/main.rs | 4 +- examples/name_server_with_error/src/server.rs | 4 +- examples/ping_pong/Cargo.toml | 2 +- examples/ping_pong/src/consumer.rs | 4 +- examples/ping_pong/src/main.rs | 2 +- examples/ping_pong/src/messages.rs | 2 +- examples/ping_pong/src/producer.rs | 4 +- examples/ping_pong_sync/Cargo.toml | 13 + examples/ping_pong_sync/src/consumer.rs | 26 + examples/ping_pong_sync/src/main.rs | 55 + examples/ping_pong_sync/src/messages.rs | 7 + examples/ping_pong_sync/src/producer.rs | 32 + examples/updater/src/main.rs | 18 +- examples/updater/src/messages.rs | 4 - examples/updater/src/server.rs | 54 +- rt/src/lib.rs | 5 - rt/src/sync/mod.rs | 4 +- rt/src/sync/mpsc.rs | 2 +- rt/src/sync/oneshot.rs | 2 +- 39 files changed, 1665 insertions(+), 237 deletions(-) create mode 100644 concurrency/src/sync/error.rs create mode 100644 concurrency/src/sync/gen_server.rs create mode 100644 concurrency/src/sync/mod.rs create mode 100644 concurrency/src/sync/process.rs create mode 100644 concurrency/src/sync/time.rs delete mode 100644 examples/bank-sync/src/main.rs rename examples/{bank-sync => bank_sync}/Cargo.toml (83%) create mode 100644 examples/bank_sync/src/main.rs rename examples/{bank-sync => bank_sync}/src/messages.rs (100%) rename examples/{bank-sync => bank_sync}/src/server.rs (83%) create mode 100644 examples/ping_pong_sync/Cargo.toml create mode 100644 examples/ping_pong_sync/src/consumer.rs create mode 100644 examples/ping_pong_sync/src/main.rs create mode 100644 examples/ping_pong_sync/src/messages.rs create mode 100644 examples/ping_pong_sync/src/producer.rs diff --git a/Cargo.lock b/Cargo.lock index 5fc26c6..ce22125 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,7 +44,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -57,7 +57,7 @@ dependencies = [ ] [[package]] -name = "bank-sync" +name = "bank_sync" version = "0.1.0" dependencies = [ "spawned-concurrency", @@ -65,18 +65,45 @@ dependencies = [ "tracing", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + [[package]] name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "cc" +version = "1.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1" +dependencies = [ + "shlex", +] + [[package]] name = "cfg-if" version = "0.1.10" @@ -89,6 +116,22 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "crossbeam" version = "0.7.3" @@ -161,6 +204,78 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + [[package]] name = "futures" version = "0.3.31" @@ -250,12 +365,259 @@ dependencies = [ "slab", ] +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "gimli" version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -268,6 +630,18 @@ version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + [[package]] name = "lock_api" version = "0.4.12" @@ -314,6 +688,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "miniz_oxide" version = "0.8.8" @@ -330,8 +710,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", - "windows-sys", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "name_server" +version = "0.1.0" +dependencies = [ + "spawned-concurrency", + "spawned-rt", + "tracing", +] + +[[package]] +name = "name_server_with_error" +version = "0.1.0" +dependencies = [ + "spawned-concurrency", + "spawned-rt", + "tracing", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", ] [[package]] @@ -359,6 +774,50 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "openssl" +version = "0.10.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +dependencies = [ + "bitflags 2.9.1", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "overload" version = "0.1.1" @@ -385,9 +844,15 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -400,6 +865,39 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "ping_pong" +version = "0.1.0" +dependencies = [ + "spawned-concurrency", + "spawned-rt", + "tracing", +] + +[[package]] +name = "ping_pong_sync" +version = "0.1.0" +dependencies = [ + "spawned-concurrency", + "spawned-rt", + "tracing", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "proc-macro2" version = "1.0.95" @@ -418,13 +916,19 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "redox_syscall" version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags", + "bitflags 2.9.1", ] [[package]] @@ -471,18 +975,168 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "rustc-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.9.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.1", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -492,6 +1146,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.5" @@ -523,7 +1183,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -545,6 +1205,12 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "syn" version = "2.0.101" @@ -556,6 +1222,57 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys 0.52.0", +] + [[package]] name = "thread_local" version = "1.1.8" @@ -566,6 +1283,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tokio" version = "1.45.0" @@ -581,7 +1308,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -595,6 +1322,35 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.41" @@ -657,24 +1413,163 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "updater" +version = "0.1.0" +dependencies = [ + "futures", + "reqwest", + "spawned-concurrency", + "spawned-rt", + "tracing", +] + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if 1.0.0", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "winapi" version = "0.3.9" @@ -697,13 +1592,46 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -712,28 +1640,46 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -746,26 +1692,153 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if 1.0.0", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index d0e700b..84fa9de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,12 @@ members = [ "rt", "examples/bank", - "examples/bank-sync", + "examples/bank_sync", + "examples/name_server", + "examples/name_server_with_error", + "examples/ping_pong", + "examples/ping_pong_sync", + "examples/updater", ] [workspace.dependencies] diff --git a/concurrency/src/async/gen_server.rs b/concurrency/src/async/gen_server.rs index 1e7883f..22a40ca 100644 --- a/concurrency/src/async/gen_server.rs +++ b/concurrency/src/async/gen_server.rs @@ -4,7 +4,7 @@ use futures::future::FutureExt as _; use spawned_rt::r#async::{self as rt, JoinHandle, mpsc, oneshot}; use std::{fmt::Debug, panic::AssertUnwindSafe}; -use crate::r#async::error::GenServerError; +use super::error::GenServerError; #[derive(Debug)] pub struct GenServerHandle { diff --git a/concurrency/src/async/mod.rs b/concurrency/src/async/mod.rs index 6cd41b3..ab6d8b0 100644 --- a/concurrency/src/async/mod.rs +++ b/concurrency/src/async/mod.rs @@ -1,7 +1,12 @@ //! λ-kit concurrency //! Some basic traits and structs to implement À-la-Erlang concurrent code. -pub(crate) mod error; -pub(crate) mod gen_server; -pub(crate) mod process; -pub(crate) mod time; +mod error; +mod gen_server; +mod process; +mod time; + +pub use error::GenServerError; +pub use gen_server::{CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg}; +pub use process::{Process, ProcessInfo, send}; +pub use time::send_after; diff --git a/concurrency/src/async/time.rs b/concurrency/src/async/time.rs index a85392f..7751a77 100644 --- a/concurrency/src/async/time.rs +++ b/concurrency/src/async/time.rs @@ -2,7 +2,7 @@ use std::time::Duration; use spawned_rt::r#async::{self as rt, JoinHandle, mpsc::Sender}; -use crate::{GenServer, GenServerInMsg}; +use super::{GenServer, GenServerInMsg}; // Sends a message after a given period to the specified GenServer. The task terminates // once the send has completed diff --git a/concurrency/src/lib.rs b/concurrency/src/lib.rs index 2345086..3c4f575 100644 --- a/concurrency/src/lib.rs +++ b/concurrency/src/lib.rs @@ -1,11 +1,5 @@ //! λ-kit concurrency //! Some basic traits and structs to implement À-la-Erlang concurrent code. -mod r#async; - -pub use r#async::error::GenServerError; -pub use r#async::gen_server::{ - CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, -}; -pub use r#async::process::{Process, ProcessInfo, send}; -pub use r#async::time::send_after; +pub mod r#async; +pub mod sync; diff --git a/concurrency/src/sync/error.rs b/concurrency/src/sync/error.rs new file mode 100644 index 0000000..8e4b3b7 --- /dev/null +++ b/concurrency/src/sync/error.rs @@ -0,0 +1,11 @@ +#[derive(Debug)] +pub enum GenServerError { + CallbackError, + ServerError, +} + +impl From> for GenServerError { + fn from(_value: spawned_rt::sync::mpsc::SendError) -> Self { + Self::ServerError + } +} diff --git a/concurrency/src/sync/gen_server.rs b/concurrency/src/sync/gen_server.rs new file mode 100644 index 0000000..3fed99f --- /dev/null +++ b/concurrency/src/sync/gen_server.rs @@ -0,0 +1,179 @@ +//! GernServer trait and structs to create an abstraction similar to Erlang gen_server. +//! See examples/name_server for a usage example. +use spawned_rt::sync::{self as rt, JoinHandle, mpsc, oneshot}; +use std::{ + fmt::Debug, + panic::{AssertUnwindSafe, catch_unwind}, +}; + +use super::error::GenServerError; + +#[derive(Debug)] +pub struct GenServerHandle { + pub tx: mpsc::Sender>, + #[allow(unused)] + handle: JoinHandle<()>, +} + +impl GenServerHandle { + pub(crate) fn new(mut initial_state: G::State) -> Self { + let (tx, mut rx) = mpsc::channel::>(); + let tx_clone = tx.clone(); + let mut gen_server: G = GenServer::new(); + let handle = rt::spawn(move || { + if gen_server + .run(&tx_clone, &mut rx, &mut initial_state) + .is_err() + { + tracing::trace!("GenServer crashed") + }; + }); + GenServerHandle { tx, handle } + } + + pub fn sender(&self) -> mpsc::Sender> { + self.tx.clone() + } + + pub fn call(&mut self, message: G::InMsg) -> Result { + let (oneshot_tx, oneshot_rx) = oneshot::channel::>(); + self.tx.send(GenServerInMsg::Call { + sender: oneshot_tx, + message, + })?; + match oneshot_rx.recv() { + Ok(result) => result, + Err(_) => Err(GenServerError::ServerError), + } + } + + pub fn cast(&mut self, message: G::InMsg) -> Result<(), GenServerError> { + self.tx + .send(GenServerInMsg::Cast { message }) + .map_err(|_error| GenServerError::ServerError) + } +} + +pub enum GenServerInMsg { + Call { + sender: oneshot::Sender>, + message: A::InMsg, + }, + Cast { + message: A::InMsg, + }, +} + +pub enum CallResponse { + Reply(U), + Stop(U), +} + +pub enum CastResponse { + NoReply, + Stop, +} + +pub trait GenServer +where + Self: Send + Sized, +{ + type InMsg: Send + Sized; + type OutMsg: Send + Sized; + type State: Clone + Send; + type Error: Debug; + + fn new() -> Self; + + fn start(initial_state: Self::State) -> GenServerHandle { + GenServerHandle::new(initial_state) + } + + fn run( + &mut self, + tx: &mpsc::Sender>, + rx: &mut mpsc::Receiver>, + state: &mut Self::State, + ) -> Result<(), GenServerError> { + self.main_loop(tx, rx, state)?; + Ok(()) + } + + fn main_loop( + &mut self, + tx: &mpsc::Sender>, + rx: &mut mpsc::Receiver>, + state: &mut Self::State, + ) -> Result<(), GenServerError> { + loop { + if !self.receive(tx, rx, state)? { + break; + } + } + tracing::trace!("Stopping GenServer"); + Ok(()) + } + + fn receive( + &mut self, + tx: &mpsc::Sender>, + rx: &mut mpsc::Receiver>, + state: &mut Self::State, + ) -> Result { + let message = rx.recv().ok(); + + // Save current state in case of a rollback + let state_clone = state.clone(); + + let (keep_running, error) = match message { + Some(GenServerInMsg::Call { sender, message }) => { + let (keep_running, error, response) = + match catch_unwind(AssertUnwindSafe(|| self.handle_call(message, tx, state))) { + Ok(response) => match response { + CallResponse::Reply(response) => (true, None, Ok(response)), + CallResponse::Stop(response) => (false, None, Ok(response)), + }, + Err(error) => (true, Some(error), Err(GenServerError::CallbackError)), + }; + // Send response back + if sender.send(response).is_err() { + tracing::trace!("GenServer failed to send response back, client must have died") + }; + (keep_running, error) + } + Some(GenServerInMsg::Cast { message }) => { + match catch_unwind(AssertUnwindSafe(|| self.handle_cast(message, tx, state))) { + Ok(response) => match response { + CastResponse::NoReply => (true, None), + CastResponse::Stop => (false, None), + }, + Err(error) => (true, Some(error)), + } + } + None => { + // Channel has been closed; won't receive further messages. Stop the server. + (false, None) + } + }; + if let Some(error) = error { + tracing::trace!("Error in callback, reverting state - Error: '{error:?}'"); + // Restore initial state (ie. dismiss any change) + *state = state_clone; + }; + Ok(keep_running) + } + + fn handle_call( + &mut self, + message: Self::InMsg, + tx: &mpsc::Sender>, + state: &mut Self::State, + ) -> CallResponse; + + fn handle_cast( + &mut self, + _message: Self::InMsg, + _tx: &mpsc::Sender>, + state: &mut Self::State, + ) -> CastResponse; +} diff --git a/concurrency/src/sync/mod.rs b/concurrency/src/sync/mod.rs new file mode 100644 index 0000000..b50c10f --- /dev/null +++ b/concurrency/src/sync/mod.rs @@ -0,0 +1,11 @@ +//! λ-kit concurrency +//! Some basic traits and structs to implement À-la-Erlang concurrent code. + +mod error; +mod gen_server; +mod process; +mod time; + +pub use gen_server::{CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg}; +pub use process::{Process, ProcessInfo, send}; +pub use time::send_after; diff --git a/concurrency/src/sync/process.rs b/concurrency/src/sync/process.rs new file mode 100644 index 0000000..56c7b8d --- /dev/null +++ b/concurrency/src/sync/process.rs @@ -0,0 +1,71 @@ +//! Process trait and struct to create a process abstraction similar to Erlang processes. +//! See examples/ping_pong for a usage example. + +use spawned_rt::sync::{self as rt, JoinHandle, mpsc}; + +#[derive(Debug)] +pub struct ProcessInfo { + pub tx: mpsc::Sender, + pub handle: JoinHandle<()>, +} + +impl ProcessInfo { + pub fn sender(&self) -> mpsc::Sender { + self.tx.clone() + } + + pub fn handle(self) -> JoinHandle<()> { + self.handle + } +} + +pub trait Process +where + Self: Send + Sync + Sized + 'static, +{ + fn spawn(mut self) -> ProcessInfo { + let (tx, mut rx) = mpsc::channel::(); + let tx_clone = tx.clone(); + let handle = rt::spawn(move || self.run(&tx_clone, &mut rx)); + ProcessInfo { tx, handle } + } + + fn run(&mut self, tx: &mpsc::Sender, rx: &mut mpsc::Receiver) { + self.init(tx); + self.main_loop(tx, rx); + } + + fn main_loop(&mut self, tx: &mpsc::Sender, rx: &mut mpsc::Receiver) { + loop { + if self.should_stop() { + break; + } + + self.receive(tx, rx); + } + } + + fn should_stop(&self) -> bool { + false + } + + fn init(&mut self, _tx: &mpsc::Sender) { + {} + } + + fn receive(&mut self, tx: &mpsc::Sender, rx: &mut mpsc::Receiver) -> T { + match rx.recv().ok() { + Some(message) => self.handle(message, tx), + None => todo!(), + } + } + + fn handle(&mut self, message: T, tx: &mpsc::Sender) -> T; +} + +pub fn send(tx: &mpsc::Sender, message: T) +where + T: Send, +{ + let _ = tx.send(message); +} diff --git a/concurrency/src/sync/time.rs b/concurrency/src/sync/time.rs new file mode 100644 index 0000000..6ea613f --- /dev/null +++ b/concurrency/src/sync/time.rs @@ -0,0 +1,21 @@ +use std::time::Duration; + +use spawned_rt::sync::{self as rt, JoinHandle, mpsc::Sender}; + +use super::gen_server::{GenServer, GenServerInMsg}; + +// Sends a message after a given period to the specified GenServer. The task terminates +// once the send has completed +pub fn send_after( + period: Duration, + tx: Sender>, + message: T::InMsg, +) -> JoinHandle<()> +where + T: GenServer + 'static, +{ + rt::spawn(move || { + rt::sleep(period); + let _ = tx.send(GenServerInMsg::Cast { message }); + }) +} diff --git a/examples/bank-sync/src/main.rs b/examples/bank-sync/src/main.rs deleted file mode 100644 index b8ef9cd..0000000 --- a/examples/bank-sync/src/main.rs +++ /dev/null @@ -1,90 +0,0 @@ -//! Simple example to test concurrency/Process abstraction. -//! -//! Based on Joe's Armstrong book: Programming Erlang, Second edition -//! Section 22.1 - The Road to the Generic Server -//! -//! Erlang usage example: -//! 1> my_bank:start(). -//! {ok,<0.33.0>} -//! 2> my_bank:deposit("joe", 10). -//! not_a_customer -//! 3> my_bank:new_account("joe"). -//! {welcome,"joe"} -//! 4> my_bank:deposit("joe", 10). -//! {thanks,"joe",your_balance_is,10} -//! 5> my_bank:deposit("joe", 30). -//! {thanks,"joe",your_balance_is,40} -//! 6> my_bank:withdraw("joe", 15). -//! {thanks,"joe",your_balance_is,25} -//! 7> my_bank:withdraw("joe", 45). -//! {sorry,"joe",you_only_have,25,in_the_bank - -mod messages; -mod server; - -use messages::{BankError, BankOutMessage}; -use server::Bank; -use spawned_concurrency::GenServer as _; -use spawned_rt as rt; - -fn main() { - rt::sync::run(execution); -} - -fn execution() { - let mut name_server = Bank::start(); - - let joe = "Joe".to_string(); - - let result = Bank::deposit(&mut name_server, joe.clone(), 10); - tracing::info!("Deposit result {result:?}"); - assert_eq!(result, Err(BankError::NotACustomer { who: joe.clone() })); - - let result = Bank::new_account(&mut name_server, "Joe".to_string()); - tracing::info!("New account result {result:?}"); - assert_eq!(result, Ok(BankOutMessage::Welcome { who: joe.clone() })); - - let result = Bank::deposit(&mut name_server, "Joe".to_string(), 10); - tracing::info!("Deposit result {result:?}"); - assert_eq!( - result, - Ok(BankOutMessage::Balance { - who: joe.clone(), - amount: 10 - }) - ); - - let result = Bank::deposit(&mut name_server, "Joe".to_string(), 30); - tracing::info!("Deposit result {result:?}"); - assert_eq!( - result, - Ok(BankOutMessage::Balance { - who: joe.clone(), - amount: 40 - }) - ); - - let result = Bank::withdraw(&mut name_server, "Joe".to_string(), 15); - tracing::info!("Withdraw result {result:?}"); - assert_eq!( - result, - Ok(BankOutMessage::WidrawOk { - who: joe.clone(), - amount: 25 - }) - ); - - let result = Bank::withdraw(&mut name_server, "Joe".to_string(), 45); - tracing::info!("Withdraw result {result:?}"); - assert_eq!( - result, - Err(BankError::InsufficientBalance { - who: joe, - amount: 25 - }) - ); - - let result = Bank::stop(&mut name_server); - tracing::info!("Stop result {result:?}"); - assert_eq!(result, Ok(BankOutMessage::Stopped)); -} diff --git a/examples/bank/src/main.rs b/examples/bank/src/main.rs index e5592df..3cfa634 100644 --- a/examples/bank/src/main.rs +++ b/examples/bank/src/main.rs @@ -26,11 +26,11 @@ use std::collections::HashMap; use messages::{BankError, BankOutMessage}; use server::Bank; -use spawned_concurrency::GenServer as _; -use spawned_rt as rt; +use spawned_concurrency::r#async::GenServer as _; +use spawned_rt::r#async as rt; fn main() { - rt::r#async::run(async { + rt::run(async { let mut name_server = Bank::start(HashMap::new()); let joe = "Joe".to_string(); diff --git a/examples/bank/src/server.rs b/examples/bank/src/server.rs index 15fe939..dacd92e 100644 --- a/examples/bank/src/server.rs +++ b/examples/bank/src/server.rs @@ -1,6 +1,8 @@ use std::collections::HashMap; -use spawned_concurrency::{CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg}; +use spawned_concurrency::r#async::{ + CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, +}; use spawned_rt::r#async::mpsc::Sender; use crate::messages::{BankError, BankInMessage as InMessage, BankOutMessage as OutMessage}; diff --git a/examples/bank-sync/Cargo.toml b/examples/bank_sync/Cargo.toml similarity index 83% rename from examples/bank-sync/Cargo.toml rename to examples/bank_sync/Cargo.toml index 3903760..be313c7 100644 --- a/examples/bank-sync/Cargo.toml +++ b/examples/bank_sync/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "bank-sync" +name = "bank_sync" version = "0.1.0" edition = "2024" @@ -9,5 +9,5 @@ spawned-concurrency = { workspace = true } tracing = { workspace = true } [[bin]] -name = "bank-sync" +name = "bank_sync" path = "src/main.rs" \ No newline at end of file diff --git a/examples/bank_sync/src/main.rs b/examples/bank_sync/src/main.rs new file mode 100644 index 0000000..cfc4d57 --- /dev/null +++ b/examples/bank_sync/src/main.rs @@ -0,0 +1,90 @@ +//! Simple example to test concurrency/Process abstraction. +//! +//! Based on Joe's Armstrong book: Programming Erlang, Second edition +//! Section 22.1 - The Road to the Generic Server +//! +//! Erlang usage example: +//! 1> my_bank:start(). +//! {ok,<0.33.0>} +//! 2> my_bank:deposit("joe", 10). +//! not_a_customer +//! 3> my_bank:new_account("joe"). +//! {welcome,"joe"} +//! 4> my_bank:deposit("joe", 10). +//! {thanks,"joe",your_balance_is,10} +//! 5> my_bank:deposit("joe", 30). +//! {thanks,"joe",your_balance_is,40} +//! 6> my_bank:withdraw("joe", 15). +//! {thanks,"joe",your_balance_is,25} +//! 7> my_bank:withdraw("joe", 45). +//! {sorry,"joe",you_only_have,25,in_the_bank + +mod messages; +mod server; + +use std::collections::HashMap; + +use messages::{BankError, BankOutMessage}; +use server::Bank; +use spawned_concurrency::sync::GenServer as _; +use spawned_rt::sync as rt; + +fn main() { + rt::run(|| { + let mut name_server = Bank::start(HashMap::new()); + + let joe = "Joe".to_string(); + + let result = Bank::deposit(&mut name_server, joe.clone(), 10); + tracing::info!("Deposit result {result:?}"); + assert_eq!(result, Err(BankError::NotACustomer { who: joe.clone() })); + + let result = Bank::new_account(&mut name_server, "Joe".to_string()); + tracing::info!("New account result {result:?}"); + assert_eq!(result, Ok(BankOutMessage::Welcome { who: joe.clone() })); + + let result = Bank::deposit(&mut name_server, "Joe".to_string(), 10); + tracing::info!("Deposit result {result:?}"); + assert_eq!( + result, + Ok(BankOutMessage::Balance { + who: joe.clone(), + amount: 10 + }) + ); + + let result = Bank::deposit(&mut name_server, "Joe".to_string(), 30); + tracing::info!("Deposit result {result:?}"); + assert_eq!( + result, + Ok(BankOutMessage::Balance { + who: joe.clone(), + amount: 40 + }) + ); + + let result = Bank::withdraw(&mut name_server, "Joe".to_string(), 15); + tracing::info!("Withdraw result {result:?}"); + assert_eq!( + result, + Ok(BankOutMessage::WidrawOk { + who: joe.clone(), + amount: 25 + }) + ); + + let result = Bank::withdraw(&mut name_server, "Joe".to_string(), 45); + tracing::info!("Withdraw result {result:?}"); + assert_eq!( + result, + Err(BankError::InsufficientBalance { + who: joe, + amount: 25 + }) + ); + + let result = Bank::stop(&mut name_server); + tracing::info!("Stop result {result:?}"); + assert_eq!(result, Ok(BankOutMessage::Stopped)); + }) +} diff --git a/examples/bank-sync/src/messages.rs b/examples/bank_sync/src/messages.rs similarity index 100% rename from examples/bank-sync/src/messages.rs rename to examples/bank_sync/src/messages.rs diff --git a/examples/bank-sync/src/server.rs b/examples/bank_sync/src/server.rs similarity index 83% rename from examples/bank-sync/src/server.rs rename to examples/bank_sync/src/server.rs index 44fe376..6a5449a 100644 --- a/examples/bank-sync/src/server.rs +++ b/examples/bank_sync/src/server.rs @@ -1,7 +1,9 @@ use std::collections::HashMap; -use spawned_concurrency::{CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg}; -use spawned_rt::mpsc::Sender; +use spawned_concurrency::sync::{ + CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, +}; +use spawned_rt::sync::mpsc::Sender; use crate::messages::{BankError, BankInMessage as InMessage, BankOutMessage as OutMessage}; @@ -13,31 +15,27 @@ type BankState = HashMap; pub struct Bank {} impl Bank { - pub async fn stop(server: &mut BankHandle) -> MsgResult { + pub fn stop(server: &mut BankHandle) -> MsgResult { server .call(InMessage::Stop) - .await .unwrap_or(Err(BankError::ServerError)) } - pub async fn new_account(server: &mut BankHandle, who: String) -> MsgResult { + pub fn new_account(server: &mut BankHandle, who: String) -> MsgResult { server .call(InMessage::New { who }) - .await .unwrap_or(Err(BankError::ServerError)) } - pub async fn deposit(server: &mut BankHandle, who: String, amount: i32) -> MsgResult { + pub fn deposit(server: &mut BankHandle, who: String, amount: i32) -> MsgResult { server .call(InMessage::Add { who, amount }) - .await .unwrap_or(Err(BankError::ServerError)) } - pub async fn withdraw(server: &mut BankHandle, who: String, amount: i32) -> MsgResult { + pub fn withdraw(server: &mut BankHandle, who: String, amount: i32) -> MsgResult { server .call(InMessage::Remove { who, amount }) - .await .unwrap_or(Err(BankError::ServerError)) } } @@ -48,10 +46,6 @@ impl GenServer for Bank { type Error = BankError; type State = BankState; - fn initial_state(&self) -> Self::State { - HashMap::new() - } - fn new() -> Self { Self {} } diff --git a/examples/name_server/src/main.rs b/examples/name_server/src/main.rs index 8eb69d8..e021952 100644 --- a/examples/name_server/src/main.rs +++ b/examples/name_server/src/main.rs @@ -18,8 +18,8 @@ use std::collections::HashMap; use messages::NameServerOutMessage; use server::NameServer; -use spawned_concurrency::GenServer as _; -use spawned_rt as rt; +use spawned_concurrency::r#async::GenServer as _; +use spawned_rt::r#async as rt; fn main() { rt::run(async { diff --git a/examples/name_server/src/server.rs b/examples/name_server/src/server.rs index d282251..5d4a9a3 100644 --- a/examples/name_server/src/server.rs +++ b/examples/name_server/src/server.rs @@ -1,7 +1,9 @@ use std::collections::HashMap; -use spawned_concurrency::{CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg}; -use spawned_rt::mpsc::Sender; +use spawned_concurrency::r#async::{ + CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, +}; +use spawned_rt::r#async::mpsc::Sender; use crate::messages::{NameServerInMessage as InMessage, NameServerOutMessage as OutMessage}; diff --git a/examples/name_server_with_error/src/main.rs b/examples/name_server_with_error/src/main.rs index ae4aae2..9fa5099 100644 --- a/examples/name_server_with_error/src/main.rs +++ b/examples/name_server_with_error/src/main.rs @@ -18,8 +18,8 @@ use std::collections::HashMap; use messages::NameServerOutMessage; use server::NameServer; -use spawned_concurrency::GenServer as _; -use spawned_rt as rt; +use spawned_concurrency::r#async::GenServer as _; +use spawned_rt::r#async as rt; fn main() { rt::run(async { diff --git a/examples/name_server_with_error/src/server.rs b/examples/name_server_with_error/src/server.rs index 134c7c8..b6c595d 100644 --- a/examples/name_server_with_error/src/server.rs +++ b/examples/name_server_with_error/src/server.rs @@ -1,9 +1,9 @@ use std::collections::HashMap; -use spawned_concurrency::{ +use spawned_concurrency::r#async::{ CallResponse, CastResponse, GenServer, GenServerError, GenServerHandle, GenServerInMsg, }; -use spawned_rt::mpsc::Sender; +use spawned_rt::r#async::mpsc::Sender; use crate::messages::{NameServerInMessage as InMessage, NameServerOutMessage as OutMessage}; diff --git a/examples/ping_pong/Cargo.toml b/examples/ping_pong/Cargo.toml index 9cbc292..71105a3 100644 --- a/examples/ping_pong/Cargo.toml +++ b/examples/ping_pong/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2024" [dependencies] -spawned-rt-sync = { workspace = true } +spawned-rt = { workspace = true } spawned-concurrency = { workspace = true } tracing = { workspace = true } diff --git a/examples/ping_pong/src/consumer.rs b/examples/ping_pong/src/consumer.rs index 9a2b57c..06609d3 100644 --- a/examples/ping_pong/src/consumer.rs +++ b/examples/ping_pong/src/consumer.rs @@ -1,5 +1,5 @@ -use spawned_concurrency::{self as concurrency, Process, ProcessInfo}; -use spawned_rt::mpsc::Sender; +use spawned_concurrency::r#async::{self as concurrency, Process, ProcessInfo}; +use spawned_rt::r#async::mpsc::Sender; use crate::messages::Message; diff --git a/examples/ping_pong/src/main.rs b/examples/ping_pong/src/main.rs index 57cc655..2cca61d 100644 --- a/examples/ping_pong/src/main.rs +++ b/examples/ping_pong/src/main.rs @@ -41,7 +41,7 @@ use std::{thread, time::Duration}; use consumer::Consumer; use producer::Producer; -use spawned_rt as rt; +use spawned_rt::r#async as rt; fn main() { rt::run(async { diff --git a/examples/ping_pong/src/messages.rs b/examples/ping_pong/src/messages.rs index e72ccfa..e7a6a58 100644 --- a/examples/ping_pong/src/messages.rs +++ b/examples/ping_pong/src/messages.rs @@ -1,4 +1,4 @@ -use spawned_rt::mpsc::Sender; +use spawned_rt::r#async::mpsc::Sender; #[derive(Debug, Clone)] pub enum Message { diff --git a/examples/ping_pong/src/producer.rs b/examples/ping_pong/src/producer.rs index 6b950a1..ac888d4 100644 --- a/examples/ping_pong/src/producer.rs +++ b/examples/ping_pong/src/producer.rs @@ -1,5 +1,5 @@ -use spawned_concurrency::{self as concurrency, Process, ProcessInfo}; -use spawned_rt::mpsc::Sender; +use spawned_concurrency::r#async::{self as concurrency, Process, ProcessInfo}; +use spawned_rt::r#async::mpsc::Sender; use crate::messages::Message; diff --git a/examples/ping_pong_sync/Cargo.toml b/examples/ping_pong_sync/Cargo.toml new file mode 100644 index 0000000..acb1146 --- /dev/null +++ b/examples/ping_pong_sync/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "ping_pong_sync" +version = "0.1.0" +edition = "2024" + +[dependencies] +spawned-rt = { workspace = true } +spawned-concurrency = { workspace = true } +tracing = { workspace = true } + +[[bin]] +name = "ping_pong_sync" +path = "src/main.rs" \ No newline at end of file diff --git a/examples/ping_pong_sync/src/consumer.rs b/examples/ping_pong_sync/src/consumer.rs new file mode 100644 index 0000000..7e10bd0 --- /dev/null +++ b/examples/ping_pong_sync/src/consumer.rs @@ -0,0 +1,26 @@ +use spawned_concurrency::sync::{self as concurrency, Process, ProcessInfo}; +use spawned_rt::sync::mpsc::Sender; + +use crate::messages::Message; + +pub struct Consumer {} + +impl Consumer { + pub fn spawn_new() -> ProcessInfo { + Self {}.spawn() + } +} + +impl Process for Consumer { + fn handle(&mut self, message: Message, _tx: &Sender) -> Message { + tracing::info!("Consumer received {message:?}"); + match message.clone() { + Message::Ping { from } => { + tracing::info!("Consumer sent Pong"); + concurrency::send(&from, Message::Pong); + } + Message::Pong => (), + }; + message + } +} diff --git a/examples/ping_pong_sync/src/main.rs b/examples/ping_pong_sync/src/main.rs new file mode 100644 index 0000000..99c0987 --- /dev/null +++ b/examples/ping_pong_sync/src/main.rs @@ -0,0 +1,55 @@ +//! Simple example to test concurrency/Process abstraction +//! +//! Based on an Erlang example: +//! -module(ping). +//! +//! -export([ping/1, pong/0, spawn_consumer/0, spawn_producer/1, start/0]). +//! +//! ping(Pid) -> +//! Pid ! {ping, self()}, +//! receive +//! pong -> +//! io:format("Received pong!!!~n"), +//! ping(Pid) +//! end. +//! +//! pong() -> +//! receive +//! {ping, Pid} -> +//! io:format("Received ping!!~n"), +//! Pid ! pong, +//! pong(); +//! die -> +//! ok +//! end. +//! +//! spawn_consumer() -> +//! spawn(ping, pong, []). +//! +//! spawn_producer(Pid) -> +//! spawn(ping, ping, [Pid]). +//! +//! start() -> +//! Pid = spawn_consumer(), +//! spawn_producer(Pid). + +mod consumer; +mod messages; +mod producer; + +use std::{thread, time::Duration}; + +use consumer::Consumer; +use producer::Producer; +use spawned_rt::sync as rt; + +fn main() { + rt::run(|| { + let consumer = Consumer::spawn_new(); + + Producer::spawn_new(consumer.sender()); + + // giving it some time before ending + thread::sleep(Duration::from_millis(1)); + }) +} diff --git a/examples/ping_pong_sync/src/messages.rs b/examples/ping_pong_sync/src/messages.rs new file mode 100644 index 0000000..2d705ec --- /dev/null +++ b/examples/ping_pong_sync/src/messages.rs @@ -0,0 +1,7 @@ +use spawned_rt::sync::mpsc::Sender; + +#[derive(Debug, Clone)] +pub enum Message { + Ping { from: Sender }, + Pong, +} diff --git a/examples/ping_pong_sync/src/producer.rs b/examples/ping_pong_sync/src/producer.rs new file mode 100644 index 0000000..500305f --- /dev/null +++ b/examples/ping_pong_sync/src/producer.rs @@ -0,0 +1,32 @@ +use spawned_concurrency::sync::{self as concurrency, Process, ProcessInfo}; +use spawned_rt::sync::mpsc::Sender; + +use crate::messages::Message; + +pub struct Producer { + consumer: Sender, +} + +impl Producer { + pub fn spawn_new(consumer: Sender) -> ProcessInfo { + Self { consumer }.spawn() + } + + fn send_ping(&self, tx: &Sender, consumer: &Sender) { + let message = Message::Ping { from: tx.clone() }; + tracing::info!("Producer sent Ping"); + concurrency::send(consumer, message); + } +} + +impl Process for Producer { + fn init(&mut self, tx: &Sender) { + self.send_ping(tx, &self.consumer); + } + + fn handle(&mut self, message: Message, tx: &Sender) -> Message { + tracing::info!("Producer received {message:?}"); + self.send_ping(tx, &self.consumer); + message + } +} diff --git a/examples/updater/src/main.rs b/examples/updater/src/main.rs index 7a9e568..0c04d11 100644 --- a/examples/updater/src/main.rs +++ b/examples/updater/src/main.rs @@ -1,11 +1,7 @@ //! Example to test a recurrent gen_server. //! //! Just activates periodically and performs an http request -<<<<<<< HEAD -//! -======= //! ->>>>>>> async_handlers mod messages; mod server; @@ -13,28 +9,18 @@ mod server; use std::{thread, time::Duration}; use messages::UpdaterOutMessage; -<<<<<<< HEAD -use server::UpdaterServer; -======= use server::{UpdateServerState, UpdaterServer}; ->>>>>>> async_handlers -use spawned_concurrency::GenServer as _; +use spawned_concurrency::r#async::GenServer as _; use spawned_rt as rt; fn main() { - rt::run(async { -<<<<<<< HEAD - let mut update_server = UpdaterServer::start(); - - let result = UpdaterServer::check(&mut update_server, "ea".to_string()).await; -======= + rt::r#async::run(async { let mut update_server = UpdaterServer::start(UpdateServerState { url: "https://httpbin.org/ip".to_string(), periodicity: Duration::from_millis(1000), }); let result = UpdaterServer::check(&mut update_server).await; ->>>>>>> async_handlers tracing::info!("Update check done: {result:?}"); assert_eq!(result, UpdaterOutMessage::Ok); diff --git a/examples/updater/src/messages.rs b/examples/updater/src/messages.rs index 7901b01..daa0589 100644 --- a/examples/updater/src/messages.rs +++ b/examples/updater/src/messages.rs @@ -1,10 +1,6 @@ #[derive(Debug, Clone)] pub enum UpdaterInMessage { -<<<<<<< HEAD - Check(String), -======= Check, ->>>>>>> async_handlers } #[allow(dead_code)] diff --git a/examples/updater/src/server.rs b/examples/updater/src/server.rs index 2760675..087f532 100644 --- a/examples/updater/src/server.rs +++ b/examples/updater/src/server.rs @@ -1,27 +1,14 @@ -<<<<<<< HEAD -use std::{collections::HashMap, time::Duration}; -======= use std::time::Duration; ->>>>>>> async_handlers -use spawned_concurrency::{ +use spawned_concurrency::r#async::{ CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, send_after, }; -use spawned_rt::mpsc::Sender; +use spawned_rt::r#async::mpsc::Sender; use crate::messages::{UpdaterInMessage as InMessage, UpdaterOutMessage as OutMessage}; type UpdateServerHandle = GenServerHandle; type UpdateServerMessage = GenServerInMsg; -<<<<<<< HEAD -type UpdateServerState = HashMap; - -pub struct UpdaterServer {} - -impl UpdaterServer { - pub async fn check(server: &mut UpdateServerHandle, url: String) -> OutMessage { - match server.cast(InMessage::Check(url)).await { -======= #[derive(Clone)] pub struct UpdateServerState { @@ -33,7 +20,6 @@ pub struct UpdaterServer {} impl UpdaterServer { pub async fn check(server: &mut UpdateServerHandle) -> OutMessage { match server.cast(InMessage::Check).await { ->>>>>>> async_handlers Ok(_) => OutMessage::Ok, Err(_) => OutMessage::Error, } @@ -50,15 +36,7 @@ impl GenServer for UpdaterServer { Self {} } -<<<<<<< HEAD - fn initial_state(&self) -> Self::State { - HashMap::new() - } - - fn handle_call( -======= async fn handle_call( ->>>>>>> async_handlers &mut self, _message: InMessage, _tx: &Sender, @@ -67,25 +45,6 @@ impl GenServer for UpdaterServer { CallResponse::Reply(OutMessage::Ok) } -<<<<<<< HEAD - fn handle_cast( - &mut self, - message: InMessage, - tx: &Sender, - _state: &mut Self::State, - ) -> CastResponse { - match message { - Self::InMsg::Check(url) => { - send_after( - Duration::from_millis(1000), - tx.clone(), - InMessage::Check("url".to_string()), - ); - tracing::info!("Fetching: {url:?}"); - //let enter = futures::executor::enter(); - let resp = futures::executor::block_on(req()); - //drop(enter); -======= async fn handle_cast( &mut self, message: InMessage, @@ -99,7 +58,6 @@ impl GenServer for UpdaterServer { tracing::info!("Fetching: {url}"); let resp = req(url).await; ->>>>>>> async_handlers tracing::info!("Response: {resp:?}"); CastResponse::NoReply @@ -108,14 +66,6 @@ impl GenServer for UpdaterServer { } } -<<<<<<< HEAD -async fn req() -> Result { - reqwest::get("https://httpbin.org/ip") - .await? - .text() - .await -======= async fn req(url: String) -> Result { reqwest::get(url).await?.text().await ->>>>>>> async_handlers } diff --git a/rt/src/lib.rs b/rt/src/lib.rs index 5f383c7..b5e318e 100644 --- a/rt/src/lib.rs +++ b/rt/src/lib.rs @@ -10,8 +10,3 @@ pub mod r#async; pub mod sync; mod tracing; - -pub use crate::sync::mpsc; -pub use crate::sync::oneshot; -pub use crate::sync::sleep; -pub use crate::sync::spawn; diff --git a/rt/src/sync/mod.rs b/rt/src/sync/mod.rs index c07e103..24160ee 100644 --- a/rt/src/sync/mod.rs +++ b/rt/src/sync/mod.rs @@ -1,11 +1,11 @@ pub mod mpsc; pub mod oneshot; -pub use std::thread::{sleep, spawn}; +pub use std::thread::{JoinHandle, sleep, spawn}; use crate::tracing::init_tracing; -pub fn run(f: fn()) -> () { +pub fn run(f: fn()) { init_tracing(); f() diff --git a/rt/src/sync/mpsc.rs b/rt/src/sync/mpsc.rs index fb8fda2..aca5b22 100644 --- a/rt/src/sync/mpsc.rs +++ b/rt/src/sync/mpsc.rs @@ -1,3 +1,3 @@ //! Tokio.rs reexports to prevent tokio dependencies within external code -pub use std::sync::mpsc::{Receiver, Sender, channel}; +pub use std::sync::mpsc::{Receiver, SendError, Sender, channel}; diff --git a/rt/src/sync/oneshot.rs b/rt/src/sync/oneshot.rs index 352c546..f70098c 100644 --- a/rt/src/sync/oneshot.rs +++ b/rt/src/sync/oneshot.rs @@ -1,3 +1,3 @@ //! Tokio.rs reexports to prevent tokio dependencies within external code -pub use crossbeam::{Receiver, Sender, crossbeam_channel as channel}; +pub use crossbeam::{Receiver, Sender, crossbeam_channel::unbounded as channel}; From 2b6ba2b86a8856aeca1535cb782d5d55670b693b Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Fri, 16 May 2025 12:39:13 -0300 Subject: [PATCH 10/15] Added sync version of updater example --- Cargo.lock | 11 ++++ Cargo.toml | 1 + examples/updater/src/main.rs | 4 +- examples/updater_sync/Cargo.toml | 15 ++++++ examples/updater_sync/src/main.rs | 30 +++++++++++ examples/updater_sync/src/messages.rs | 11 ++++ examples/updater_sync/src/server.rs | 72 +++++++++++++++++++++++++++ 7 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 examples/updater_sync/Cargo.toml create mode 100644 examples/updater_sync/src/main.rs create mode 100644 examples/updater_sync/src/messages.rs create mode 100644 examples/updater_sync/src/server.rs diff --git a/Cargo.lock b/Cargo.lock index ce22125..8799d75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1436,6 +1436,17 @@ dependencies = [ "tracing", ] +[[package]] +name = "updater_sync" +version = "0.1.0" +dependencies = [ + "futures", + "reqwest", + "spawned-concurrency", + "spawned-rt", + "tracing", +] + [[package]] name = "url" version = "2.5.4" diff --git a/Cargo.toml b/Cargo.toml index 84fa9de..cdc2048 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ members = [ "examples/ping_pong", "examples/ping_pong_sync", "examples/updater", + "examples/updater_sync", ] [workspace.dependencies] diff --git a/examples/updater/src/main.rs b/examples/updater/src/main.rs index 0c04d11..fa63627 100644 --- a/examples/updater/src/main.rs +++ b/examples/updater/src/main.rs @@ -11,10 +11,10 @@ use std::{thread, time::Duration}; use messages::UpdaterOutMessage; use server::{UpdateServerState, UpdaterServer}; use spawned_concurrency::r#async::GenServer as _; -use spawned_rt as rt; +use spawned_rt::r#async as rt; fn main() { - rt::r#async::run(async { + rt::run(async { let mut update_server = UpdaterServer::start(UpdateServerState { url: "https://httpbin.org/ip".to_string(), periodicity: Duration::from_millis(1000), diff --git a/examples/updater_sync/Cargo.toml b/examples/updater_sync/Cargo.toml new file mode 100644 index 0000000..426637e --- /dev/null +++ b/examples/updater_sync/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "updater_sync" +version = "0.1.0" +edition = "2024" + +[dependencies] +spawned-rt = { workspace = true } +spawned-concurrency = { workspace = true } +tracing = { workspace = true } +reqwest = { version = "0.11", features = ["blocking"] } +futures = "0.3.1" + +[[bin]] +name = "updater_sync" +path = "src/main.rs" \ No newline at end of file diff --git a/examples/updater_sync/src/main.rs b/examples/updater_sync/src/main.rs new file mode 100644 index 0000000..441968a --- /dev/null +++ b/examples/updater_sync/src/main.rs @@ -0,0 +1,30 @@ +//! Example to test a recurrent gen_server. +//! +//! Just activates periodically and performs an http request +//! + +mod messages; +mod server; + +use std::{thread, time::Duration}; + +use messages::UpdaterOutMessage; +use server::{UpdateServerState, UpdaterServer}; +use spawned_concurrency::sync::GenServer as _; +use spawned_rt::sync as rt; + +fn main() { + rt::run(|| { + let mut update_server = UpdaterServer::start(UpdateServerState { + url: "https://httpbin.org/ip".to_string(), + periodicity: Duration::from_millis(1000), + }); + + let result = UpdaterServer::check(&mut update_server); + tracing::info!("Update check done: {result:?}"); + assert_eq!(result, UpdaterOutMessage::Ok); + + // giving it some time before ending + thread::sleep(Duration::from_secs(10)); + }) +} diff --git a/examples/updater_sync/src/messages.rs b/examples/updater_sync/src/messages.rs new file mode 100644 index 0000000..daa0589 --- /dev/null +++ b/examples/updater_sync/src/messages.rs @@ -0,0 +1,11 @@ +#[derive(Debug, Clone)] +pub enum UpdaterInMessage { + Check, +} + +#[allow(dead_code)] +#[derive(Debug, Clone, PartialEq)] +pub enum UpdaterOutMessage { + Ok, + Error, +} diff --git a/examples/updater_sync/src/server.rs b/examples/updater_sync/src/server.rs new file mode 100644 index 0000000..95f734e --- /dev/null +++ b/examples/updater_sync/src/server.rs @@ -0,0 +1,72 @@ +use std::time::Duration; + +use spawned_concurrency::sync::{ + CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, send_after, +}; +use spawned_rt::sync::mpsc::Sender; + +use crate::messages::{UpdaterInMessage as InMessage, UpdaterOutMessage as OutMessage}; + +type UpdateServerHandle = GenServerHandle; +type UpdateServerMessage = GenServerInMsg; + +#[derive(Clone)] +pub struct UpdateServerState { + pub url: String, + pub periodicity: Duration, +} +pub struct UpdaterServer {} + +impl UpdaterServer { + pub fn check(server: &mut UpdateServerHandle) -> OutMessage { + match server.cast(InMessage::Check) { + Ok(_) => OutMessage::Ok, + Err(_) => OutMessage::Error, + } + } +} + +impl GenServer for UpdaterServer { + type InMsg = InMessage; + type OutMsg = OutMessage; + type Error = std::fmt::Error; + type State = UpdateServerState; + + fn new() -> Self { + Self {} + } + + fn handle_call( + &mut self, + _message: InMessage, + _tx: &Sender, + _state: &mut Self::State, + ) -> CallResponse { + CallResponse::Reply(OutMessage::Ok) + } + + fn handle_cast( + &mut self, + message: InMessage, + tx: &Sender, + state: &mut Self::State, + ) -> CastResponse { + match message { + Self::InMsg::Check => { + send_after(state.periodicity, tx.clone(), InMessage::Check); + let url = state.url.clone(); + tracing::info!("Fetching: {url}"); + let resp = req(url); + + tracing::info!("Response: {resp:?}"); + + CastResponse::NoReply + } + } + } +} + +fn req(url: String) -> Result { + let rt = spawned_rt::r#async::Runtime::new().unwrap(); + rt.block_on(async { reqwest::get(url).await?.text().await }) +} From c4725ec634512bd6788f68d9b071f765af08f727 Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Fri, 16 May 2025 15:22:21 -0300 Subject: [PATCH 11/15] block_on function for async usage within sync code --- examples/updater_sync/src/server.rs | 9 ++++----- rt/src/sync/mod.rs | 7 ++++++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/examples/updater_sync/src/server.rs b/examples/updater_sync/src/server.rs index 95f734e..545dce6 100644 --- a/examples/updater_sync/src/server.rs +++ b/examples/updater_sync/src/server.rs @@ -3,7 +3,7 @@ use std::time::Duration; use spawned_concurrency::sync::{ CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, send_after, }; -use spawned_rt::sync::mpsc::Sender; +use spawned_rt::sync::{block_on, mpsc::Sender}; use crate::messages::{UpdaterInMessage as InMessage, UpdaterOutMessage as OutMessage}; @@ -56,7 +56,7 @@ impl GenServer for UpdaterServer { send_after(state.periodicity, tx.clone(), InMessage::Check); let url = state.url.clone(); tracing::info!("Fetching: {url}"); - let resp = req(url); + let resp = block_on(req(url)); tracing::info!("Response: {resp:?}"); @@ -66,7 +66,6 @@ impl GenServer for UpdaterServer { } } -fn req(url: String) -> Result { - let rt = spawned_rt::r#async::Runtime::new().unwrap(); - rt.block_on(async { reqwest::get(url).await?.text().await }) +async fn req(url: String) -> Result { + reqwest::get(url).await?.text().await } diff --git a/rt/src/sync/mod.rs b/rt/src/sync/mod.rs index 24160ee..a7647bb 100644 --- a/rt/src/sync/mod.rs +++ b/rt/src/sync/mod.rs @@ -3,10 +3,15 @@ pub mod oneshot; pub use std::thread::{JoinHandle, sleep, spawn}; -use crate::tracing::init_tracing; +use crate::{r#async::Runtime, tracing::init_tracing}; pub fn run(f: fn()) { init_tracing(); f() } + +pub fn block_on(future: F) -> F::Output { + let rt = Runtime::new().unwrap(); + rt.block_on(future) +} \ No newline at end of file From 91fa96ef9a8b280c26c8d06cac47ca68ab83343a Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Tue, 20 May 2025 10:59:59 -0300 Subject: [PATCH 12/15] Typo fix --- concurrency/src/async/gen_server.rs | 2 +- concurrency/src/sync/gen_server.rs | 2 +- rt/src/sync/mod.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/concurrency/src/async/gen_server.rs b/concurrency/src/async/gen_server.rs index 22a40ca..ab41797 100644 --- a/concurrency/src/async/gen_server.rs +++ b/concurrency/src/async/gen_server.rs @@ -1,4 +1,4 @@ -//! GernServer trait and structs to create an abstraction similar to Erlang gen_server. +//! GenServer trait and structs to create an abstraction similar to Erlang gen_server. //! See examples/name_server for a usage example. use futures::future::FutureExt as _; use spawned_rt::r#async::{self as rt, JoinHandle, mpsc, oneshot}; diff --git a/concurrency/src/sync/gen_server.rs b/concurrency/src/sync/gen_server.rs index 3fed99f..321e59d 100644 --- a/concurrency/src/sync/gen_server.rs +++ b/concurrency/src/sync/gen_server.rs @@ -1,4 +1,4 @@ -//! GernServer trait and structs to create an abstraction similar to Erlang gen_server. +//! GenServer trait and structs to create an abstraction similar to Erlang gen_server. //! See examples/name_server for a usage example. use spawned_rt::sync::{self as rt, JoinHandle, mpsc, oneshot}; use std::{ diff --git a/rt/src/sync/mod.rs b/rt/src/sync/mod.rs index a7647bb..9040fa7 100644 --- a/rt/src/sync/mod.rs +++ b/rt/src/sync/mod.rs @@ -14,4 +14,4 @@ pub fn run(f: fn()) { pub fn block_on(future: F) -> F::Output { let rt = Runtime::new().unwrap(); rt.block_on(future) -} \ No newline at end of file +} From 3843b145224a6725165ffe00994801ef5f7286d5 Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Tue, 20 May 2025 18:21:00 -0300 Subject: [PATCH 13/15] Changed edition in Cargo.toml --- examples/bank_sync/Cargo.toml | 2 +- examples/ping_pong_sync/Cargo.toml | 2 +- examples/updater_sync/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/bank_sync/Cargo.toml b/examples/bank_sync/Cargo.toml index be313c7..7564f8d 100644 --- a/examples/bank_sync/Cargo.toml +++ b/examples/bank_sync/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "bank_sync" version = "0.1.0" -edition = "2024" +edition = "2021" [dependencies] spawned-rt = { workspace = true } diff --git a/examples/ping_pong_sync/Cargo.toml b/examples/ping_pong_sync/Cargo.toml index acb1146..94c9776 100644 --- a/examples/ping_pong_sync/Cargo.toml +++ b/examples/ping_pong_sync/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ping_pong_sync" version = "0.1.0" -edition = "2024" +edition = "2021" [dependencies] spawned-rt = { workspace = true } diff --git a/examples/updater_sync/Cargo.toml b/examples/updater_sync/Cargo.toml index 426637e..76ae699 100644 --- a/examples/updater_sync/Cargo.toml +++ b/examples/updater_sync/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "updater_sync" version = "0.1.0" -edition = "2024" +edition = "2021" [dependencies] spawned-rt = { workspace = true } From 0e89d5214ebf14013c24ccde73be4b87fcfce7b4 Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Tue, 27 May 2025 09:40:34 -0300 Subject: [PATCH 14/15] Renamed async/sync for tasks/threads --- Cargo.lock | 6 +++--- Cargo.toml | 6 +++--- concurrency/src/lib.rs | 4 ++-- concurrency/src/sync/error.rs | 11 ----------- concurrency/src/tasks/error.rs | 11 +++++++++++ concurrency/src/{async => tasks}/gen_server.rs | 2 +- concurrency/src/{async => tasks}/mod.rs | 0 concurrency/src/{async => tasks}/process.rs | 2 +- concurrency/src/{async => tasks}/time.rs | 2 +- concurrency/src/{async => threads}/error.rs | 4 ++-- concurrency/src/{sync => threads}/gen_server.rs | 2 +- concurrency/src/{sync => threads}/mod.rs | 0 concurrency/src/{sync => threads}/process.rs | 2 +- concurrency/src/{sync => threads}/time.rs | 2 +- examples/bank/src/main.rs | 4 ++-- examples/bank/src/server.rs | 4 ++-- examples/{bank_sync => bank_threads}/Cargo.toml | 4 ++-- examples/{bank_sync => bank_threads}/src/main.rs | 4 ++-- examples/{bank_sync => bank_threads}/src/messages.rs | 0 examples/{bank_sync => bank_threads}/src/server.rs | 4 ++-- examples/name_server/src/main.rs | 4 ++-- examples/name_server/src/server.rs | 4 ++-- examples/name_server_with_error/src/main.rs | 4 ++-- examples/name_server_with_error/src/server.rs | 4 ++-- examples/ping_pong/src/consumer.rs | 4 ++-- examples/ping_pong/src/main.rs | 2 +- examples/ping_pong/src/messages.rs | 2 +- examples/ping_pong/src/producer.rs | 4 ++-- .../{ping_pong_sync => ping_pong_threads}/Cargo.toml | 4 ++-- .../src/consumer.rs | 4 ++-- .../{ping_pong_sync => ping_pong_threads}/src/main.rs | 2 +- .../src/messages.rs | 2 +- .../src/producer.rs | 4 ++-- examples/updater/src/main.rs | 4 ++-- examples/updater/src/server.rs | 4 ++-- examples/{updater_sync => updater_threads}/Cargo.toml | 4 ++-- .../{updater_sync => updater_threads}/src/main.rs | 4 ++-- .../{updater_sync => updater_threads}/src/messages.rs | 0 .../{updater_sync => updater_threads}/src/server.rs | 4 ++-- rt/src/lib.rs | 4 ++-- rt/src/{async => tasks}/mod.rs | 8 ++++---- rt/src/{async => tasks}/tokio/mod.rs | 0 rt/src/{async => tasks}/tokio/mpsc.rs | 0 rt/src/{async => tasks}/tokio/oneshot.rs | 0 rt/src/{sync => threads}/mod.rs | 2 +- rt/src/{sync => threads}/mpsc.rs | 0 rt/src/{sync => threads}/oneshot.rs | 0 47 files changed, 76 insertions(+), 76 deletions(-) delete mode 100644 concurrency/src/sync/error.rs create mode 100644 concurrency/src/tasks/error.rs rename concurrency/src/{async => tasks}/gen_server.rs (98%) rename concurrency/src/{async => tasks}/mod.rs (100%) rename concurrency/src/{async => tasks}/process.rs (97%) rename concurrency/src/{async => tasks}/time.rs (87%) rename concurrency/src/{async => threads}/error.rs (51%) rename concurrency/src/{sync => threads}/gen_server.rs (98%) rename concurrency/src/{sync => threads}/mod.rs (100%) rename concurrency/src/{sync => threads}/process.rs (96%) rename concurrency/src/{sync => threads}/time.rs (87%) rename examples/{bank_sync => bank_threads}/Cargo.toml (81%) rename examples/{bank_sync => bank_threads}/src/main.rs (97%) rename examples/{bank_sync => bank_threads}/src/messages.rs (100%) rename examples/{bank_sync => bank_threads}/src/server.rs (97%) rename examples/{ping_pong_sync => ping_pong_threads}/Cargo.toml (78%) rename examples/{ping_pong_sync => ping_pong_threads}/src/consumer.rs (83%) rename examples/{ping_pong_sync => ping_pong_threads}/src/main.rs (97%) rename examples/{ping_pong_sync => ping_pong_threads}/src/messages.rs (70%) rename examples/{ping_pong_sync => ping_pong_threads}/src/producer.rs (87%) rename examples/{updater_sync => updater_threads}/Cargo.toml (84%) rename examples/{updater_sync => updater_threads}/src/main.rs (90%) rename examples/{updater_sync => updater_threads}/src/messages.rs (100%) rename examples/{updater_sync => updater_threads}/src/server.rs (95%) rename rt/src/{async => tasks}/mod.rs (79%) rename rt/src/{async => tasks}/tokio/mod.rs (100%) rename rt/src/{async => tasks}/tokio/mpsc.rs (100%) rename rt/src/{async => tasks}/tokio/oneshot.rs (100%) rename rt/src/{sync => threads}/mod.rs (83%) rename rt/src/{sync => threads}/mpsc.rs (100%) rename rt/src/{sync => threads}/oneshot.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index bf734d2..c4bb721 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -57,7 +57,7 @@ dependencies = [ ] [[package]] -name = "bank_sync" +name = "bank_threads" version = "0.1.0" dependencies = [ "spawned-concurrency", @@ -875,7 +875,7 @@ dependencies = [ ] [[package]] -name = "ping_pong_sync" +name = "ping_pong_threads" version = "0.1.0" dependencies = [ "spawned-concurrency", @@ -1437,7 +1437,7 @@ dependencies = [ ] [[package]] -name = "updater_sync" +name = "updater_threads" version = "0.1.0" dependencies = [ "futures", diff --git a/Cargo.toml b/Cargo.toml index cdc2048..a6f68bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,13 +2,13 @@ members = [ "rt", "examples/bank", - "examples/bank_sync", + "examples/bank_threads", "examples/name_server", "examples/name_server_with_error", "examples/ping_pong", - "examples/ping_pong_sync", + "examples/ping_pong_threads", "examples/updater", - "examples/updater_sync", + "examples/updater_threads", ] [workspace.dependencies] diff --git a/concurrency/src/lib.rs b/concurrency/src/lib.rs index 3c4f575..ca158a2 100644 --- a/concurrency/src/lib.rs +++ b/concurrency/src/lib.rs @@ -1,5 +1,5 @@ //! λ-kit concurrency //! Some basic traits and structs to implement À-la-Erlang concurrent code. -pub mod r#async; -pub mod sync; +pub mod tasks; +pub mod threads; diff --git a/concurrency/src/sync/error.rs b/concurrency/src/sync/error.rs deleted file mode 100644 index 8e4b3b7..0000000 --- a/concurrency/src/sync/error.rs +++ /dev/null @@ -1,11 +0,0 @@ -#[derive(Debug)] -pub enum GenServerError { - CallbackError, - ServerError, -} - -impl From> for GenServerError { - fn from(_value: spawned_rt::sync::mpsc::SendError) -> Self { - Self::ServerError - } -} diff --git a/concurrency/src/tasks/error.rs b/concurrency/src/tasks/error.rs new file mode 100644 index 0000000..05653fa --- /dev/null +++ b/concurrency/src/tasks/error.rs @@ -0,0 +1,11 @@ +#[derive(Debug)] +pub enum GenServerError { + CallbackError, + ServerError, +} + +impl From> for GenServerError { + fn from(_value: spawned_rt::tasks::mpsc::SendError) -> Self { + Self::ServerError + } +} diff --git a/concurrency/src/async/gen_server.rs b/concurrency/src/tasks/gen_server.rs similarity index 98% rename from concurrency/src/async/gen_server.rs rename to concurrency/src/tasks/gen_server.rs index 0de60bb..1723d3c 100644 --- a/concurrency/src/async/gen_server.rs +++ b/concurrency/src/tasks/gen_server.rs @@ -1,7 +1,7 @@ //! GenServer trait and structs to create an abstraction similar to Erlang gen_server. //! See examples/name_server for a usage example. use futures::future::FutureExt as _; -use spawned_rt::r#async::{self as rt, mpsc, oneshot, JoinHandle}; +use spawned_rt::tasks::{self as rt, mpsc, oneshot, JoinHandle}; use std::{fmt::Debug, future::Future, panic::AssertUnwindSafe}; use super::error::GenServerError; diff --git a/concurrency/src/async/mod.rs b/concurrency/src/tasks/mod.rs similarity index 100% rename from concurrency/src/async/mod.rs rename to concurrency/src/tasks/mod.rs diff --git a/concurrency/src/async/process.rs b/concurrency/src/tasks/process.rs similarity index 97% rename from concurrency/src/async/process.rs rename to concurrency/src/tasks/process.rs index cd5d222..b623d2b 100644 --- a/concurrency/src/async/process.rs +++ b/concurrency/src/tasks/process.rs @@ -1,7 +1,7 @@ //! Process trait and struct to create a process abstraction similar to Erlang processes. //! See examples/ping_pong for a usage example. -use spawned_rt::r#async::{self as rt, mpsc, JoinHandle}; +use spawned_rt::tasks::{self as rt, mpsc, JoinHandle}; use std::future::Future; #[derive(Debug)] diff --git a/concurrency/src/async/time.rs b/concurrency/src/tasks/time.rs similarity index 87% rename from concurrency/src/async/time.rs rename to concurrency/src/tasks/time.rs index 07ceee3..79752c8 100644 --- a/concurrency/src/async/time.rs +++ b/concurrency/src/tasks/time.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use spawned_rt::r#async::{self as rt, mpsc::Sender, JoinHandle}; +use spawned_rt::tasks::{self as rt, mpsc::Sender, JoinHandle}; use super::{GenServer, GenServerInMsg}; diff --git a/concurrency/src/async/error.rs b/concurrency/src/threads/error.rs similarity index 51% rename from concurrency/src/async/error.rs rename to concurrency/src/threads/error.rs index b2ceff4..735e37e 100644 --- a/concurrency/src/async/error.rs +++ b/concurrency/src/threads/error.rs @@ -4,8 +4,8 @@ pub enum GenServerError { ServerError, } -impl From> for GenServerError { - fn from(_value: spawned_rt::r#async::mpsc::SendError) -> Self { +impl From> for GenServerError { + fn from(_value: spawned_rt::threads::mpsc::SendError) -> Self { Self::ServerError } } diff --git a/concurrency/src/sync/gen_server.rs b/concurrency/src/threads/gen_server.rs similarity index 98% rename from concurrency/src/sync/gen_server.rs rename to concurrency/src/threads/gen_server.rs index d1d72d7..e759a0d 100644 --- a/concurrency/src/sync/gen_server.rs +++ b/concurrency/src/threads/gen_server.rs @@ -1,6 +1,6 @@ //! GenServer trait and structs to create an abstraction similar to Erlang gen_server. //! See examples/name_server for a usage example. -use spawned_rt::sync::{self as rt, mpsc, oneshot, JoinHandle}; +use spawned_rt::threads::{self as rt, mpsc, oneshot, JoinHandle}; use std::{ fmt::Debug, panic::{catch_unwind, AssertUnwindSafe}, diff --git a/concurrency/src/sync/mod.rs b/concurrency/src/threads/mod.rs similarity index 100% rename from concurrency/src/sync/mod.rs rename to concurrency/src/threads/mod.rs diff --git a/concurrency/src/sync/process.rs b/concurrency/src/threads/process.rs similarity index 96% rename from concurrency/src/sync/process.rs rename to concurrency/src/threads/process.rs index 6919ea6..3dfd87d 100644 --- a/concurrency/src/sync/process.rs +++ b/concurrency/src/threads/process.rs @@ -1,7 +1,7 @@ //! Process trait and struct to create a process abstraction similar to Erlang processes. //! See examples/ping_pong for a usage example. -use spawned_rt::sync::{self as rt, mpsc, JoinHandle}; +use spawned_rt::threads::{self as rt, mpsc, JoinHandle}; #[derive(Debug)] pub struct ProcessInfo { diff --git a/concurrency/src/sync/time.rs b/concurrency/src/threads/time.rs similarity index 87% rename from concurrency/src/sync/time.rs rename to concurrency/src/threads/time.rs index 861f7e1..034295f 100644 --- a/concurrency/src/sync/time.rs +++ b/concurrency/src/threads/time.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use spawned_rt::sync::{self as rt, mpsc::Sender, JoinHandle}; +use spawned_rt::threads::{self as rt, mpsc::Sender, JoinHandle}; use super::gen_server::{GenServer, GenServerInMsg}; diff --git a/examples/bank/src/main.rs b/examples/bank/src/main.rs index 3cfa634..90f97eb 100644 --- a/examples/bank/src/main.rs +++ b/examples/bank/src/main.rs @@ -26,8 +26,8 @@ use std::collections::HashMap; use messages::{BankError, BankOutMessage}; use server::Bank; -use spawned_concurrency::r#async::GenServer as _; -use spawned_rt::r#async as rt; +use spawned_concurrency::tasks::GenServer as _; +use spawned_rt::tasks as rt; fn main() { rt::run(async { diff --git a/examples/bank/src/server.rs b/examples/bank/src/server.rs index dacd92e..3218e00 100644 --- a/examples/bank/src/server.rs +++ b/examples/bank/src/server.rs @@ -1,9 +1,9 @@ use std::collections::HashMap; -use spawned_concurrency::r#async::{ +use spawned_concurrency::tasks::{ CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, }; -use spawned_rt::r#async::mpsc::Sender; +use spawned_rt::tasks::mpsc::Sender; use crate::messages::{BankError, BankInMessage as InMessage, BankOutMessage as OutMessage}; diff --git a/examples/bank_sync/Cargo.toml b/examples/bank_threads/Cargo.toml similarity index 81% rename from examples/bank_sync/Cargo.toml rename to examples/bank_threads/Cargo.toml index 7564f8d..0f4f4e0 100644 --- a/examples/bank_sync/Cargo.toml +++ b/examples/bank_threads/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "bank_sync" +name = "bank_threads" version = "0.1.0" edition = "2021" @@ -9,5 +9,5 @@ spawned-concurrency = { workspace = true } tracing = { workspace = true } [[bin]] -name = "bank_sync" +name = "bank_threads" path = "src/main.rs" \ No newline at end of file diff --git a/examples/bank_sync/src/main.rs b/examples/bank_threads/src/main.rs similarity index 97% rename from examples/bank_sync/src/main.rs rename to examples/bank_threads/src/main.rs index cfc4d57..c04a6ac 100644 --- a/examples/bank_sync/src/main.rs +++ b/examples/bank_threads/src/main.rs @@ -26,8 +26,8 @@ use std::collections::HashMap; use messages::{BankError, BankOutMessage}; use server::Bank; -use spawned_concurrency::sync::GenServer as _; -use spawned_rt::sync as rt; +use spawned_concurrency::threads::GenServer as _; +use spawned_rt::threads as rt; fn main() { rt::run(|| { diff --git a/examples/bank_sync/src/messages.rs b/examples/bank_threads/src/messages.rs similarity index 100% rename from examples/bank_sync/src/messages.rs rename to examples/bank_threads/src/messages.rs diff --git a/examples/bank_sync/src/server.rs b/examples/bank_threads/src/server.rs similarity index 97% rename from examples/bank_sync/src/server.rs rename to examples/bank_threads/src/server.rs index 6a5449a..8faf775 100644 --- a/examples/bank_sync/src/server.rs +++ b/examples/bank_threads/src/server.rs @@ -1,9 +1,9 @@ use std::collections::HashMap; -use spawned_concurrency::sync::{ +use spawned_concurrency::threads::{ CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, }; -use spawned_rt::sync::mpsc::Sender; +use spawned_rt::threads::mpsc::Sender; use crate::messages::{BankError, BankInMessage as InMessage, BankOutMessage as OutMessage}; diff --git a/examples/name_server/src/main.rs b/examples/name_server/src/main.rs index e021952..713d41c 100644 --- a/examples/name_server/src/main.rs +++ b/examples/name_server/src/main.rs @@ -18,8 +18,8 @@ use std::collections::HashMap; use messages::NameServerOutMessage; use server::NameServer; -use spawned_concurrency::r#async::GenServer as _; -use spawned_rt::r#async as rt; +use spawned_concurrency::tasks::GenServer as _; +use spawned_rt::tasks as rt; fn main() { rt::run(async { diff --git a/examples/name_server/src/server.rs b/examples/name_server/src/server.rs index 5d4a9a3..5e77401 100644 --- a/examples/name_server/src/server.rs +++ b/examples/name_server/src/server.rs @@ -1,9 +1,9 @@ use std::collections::HashMap; -use spawned_concurrency::r#async::{ +use spawned_concurrency::tasks::{ CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, }; -use spawned_rt::r#async::mpsc::Sender; +use spawned_rt::tasks::mpsc::Sender; use crate::messages::{NameServerInMessage as InMessage, NameServerOutMessage as OutMessage}; diff --git a/examples/name_server_with_error/src/main.rs b/examples/name_server_with_error/src/main.rs index 9fa5099..7cc5f67 100644 --- a/examples/name_server_with_error/src/main.rs +++ b/examples/name_server_with_error/src/main.rs @@ -18,8 +18,8 @@ use std::collections::HashMap; use messages::NameServerOutMessage; use server::NameServer; -use spawned_concurrency::r#async::GenServer as _; -use spawned_rt::r#async as rt; +use spawned_concurrency::tasks::GenServer as _; +use spawned_rt::tasks as rt; fn main() { rt::run(async { diff --git a/examples/name_server_with_error/src/server.rs b/examples/name_server_with_error/src/server.rs index b6c595d..c72028d 100644 --- a/examples/name_server_with_error/src/server.rs +++ b/examples/name_server_with_error/src/server.rs @@ -1,9 +1,9 @@ use std::collections::HashMap; -use spawned_concurrency::r#async::{ +use spawned_concurrency::tasks::{ CallResponse, CastResponse, GenServer, GenServerError, GenServerHandle, GenServerInMsg, }; -use spawned_rt::r#async::mpsc::Sender; +use spawned_rt::tasks::mpsc::Sender; use crate::messages::{NameServerInMessage as InMessage, NameServerOutMessage as OutMessage}; diff --git a/examples/ping_pong/src/consumer.rs b/examples/ping_pong/src/consumer.rs index 06609d3..8ead269 100644 --- a/examples/ping_pong/src/consumer.rs +++ b/examples/ping_pong/src/consumer.rs @@ -1,5 +1,5 @@ -use spawned_concurrency::r#async::{self as concurrency, Process, ProcessInfo}; -use spawned_rt::r#async::mpsc::Sender; +use spawned_concurrency::tasks::{self as concurrency, Process, ProcessInfo}; +use spawned_rt::tasks::mpsc::Sender; use crate::messages::Message; diff --git a/examples/ping_pong/src/main.rs b/examples/ping_pong/src/main.rs index 2cca61d..1b1599b 100644 --- a/examples/ping_pong/src/main.rs +++ b/examples/ping_pong/src/main.rs @@ -41,7 +41,7 @@ use std::{thread, time::Duration}; use consumer::Consumer; use producer::Producer; -use spawned_rt::r#async as rt; +use spawned_rt::tasks as rt; fn main() { rt::run(async { diff --git a/examples/ping_pong/src/messages.rs b/examples/ping_pong/src/messages.rs index e7a6a58..a22ae6c 100644 --- a/examples/ping_pong/src/messages.rs +++ b/examples/ping_pong/src/messages.rs @@ -1,4 +1,4 @@ -use spawned_rt::r#async::mpsc::Sender; +use spawned_rt::tasks::mpsc::Sender; #[derive(Debug, Clone)] pub enum Message { diff --git a/examples/ping_pong/src/producer.rs b/examples/ping_pong/src/producer.rs index ac888d4..71829a1 100644 --- a/examples/ping_pong/src/producer.rs +++ b/examples/ping_pong/src/producer.rs @@ -1,5 +1,5 @@ -use spawned_concurrency::r#async::{self as concurrency, Process, ProcessInfo}; -use spawned_rt::r#async::mpsc::Sender; +use spawned_concurrency::tasks::{self as concurrency, Process, ProcessInfo}; +use spawned_rt::tasks::mpsc::Sender; use crate::messages::Message; diff --git a/examples/ping_pong_sync/Cargo.toml b/examples/ping_pong_threads/Cargo.toml similarity index 78% rename from examples/ping_pong_sync/Cargo.toml rename to examples/ping_pong_threads/Cargo.toml index 94c9776..fb2b28a 100644 --- a/examples/ping_pong_sync/Cargo.toml +++ b/examples/ping_pong_threads/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "ping_pong_sync" +name = "ping_pong_threads" version = "0.1.0" edition = "2021" @@ -9,5 +9,5 @@ spawned-concurrency = { workspace = true } tracing = { workspace = true } [[bin]] -name = "ping_pong_sync" +name = "ping_pong_threads" path = "src/main.rs" \ No newline at end of file diff --git a/examples/ping_pong_sync/src/consumer.rs b/examples/ping_pong_threads/src/consumer.rs similarity index 83% rename from examples/ping_pong_sync/src/consumer.rs rename to examples/ping_pong_threads/src/consumer.rs index 7e10bd0..44777c4 100644 --- a/examples/ping_pong_sync/src/consumer.rs +++ b/examples/ping_pong_threads/src/consumer.rs @@ -1,5 +1,5 @@ -use spawned_concurrency::sync::{self as concurrency, Process, ProcessInfo}; -use spawned_rt::sync::mpsc::Sender; +use spawned_concurrency::threads::{self as concurrency, Process, ProcessInfo}; +use spawned_rt::threads::mpsc::Sender; use crate::messages::Message; diff --git a/examples/ping_pong_sync/src/main.rs b/examples/ping_pong_threads/src/main.rs similarity index 97% rename from examples/ping_pong_sync/src/main.rs rename to examples/ping_pong_threads/src/main.rs index 99c0987..73fc4d6 100644 --- a/examples/ping_pong_sync/src/main.rs +++ b/examples/ping_pong_threads/src/main.rs @@ -41,7 +41,7 @@ use std::{thread, time::Duration}; use consumer::Consumer; use producer::Producer; -use spawned_rt::sync as rt; +use spawned_rt::threads as rt; fn main() { rt::run(|| { diff --git a/examples/ping_pong_sync/src/messages.rs b/examples/ping_pong_threads/src/messages.rs similarity index 70% rename from examples/ping_pong_sync/src/messages.rs rename to examples/ping_pong_threads/src/messages.rs index 2d705ec..e8a07ef 100644 --- a/examples/ping_pong_sync/src/messages.rs +++ b/examples/ping_pong_threads/src/messages.rs @@ -1,4 +1,4 @@ -use spawned_rt::sync::mpsc::Sender; +use spawned_rt::threads::mpsc::Sender; #[derive(Debug, Clone)] pub enum Message { diff --git a/examples/ping_pong_sync/src/producer.rs b/examples/ping_pong_threads/src/producer.rs similarity index 87% rename from examples/ping_pong_sync/src/producer.rs rename to examples/ping_pong_threads/src/producer.rs index 500305f..01dd564 100644 --- a/examples/ping_pong_sync/src/producer.rs +++ b/examples/ping_pong_threads/src/producer.rs @@ -1,5 +1,5 @@ -use spawned_concurrency::sync::{self as concurrency, Process, ProcessInfo}; -use spawned_rt::sync::mpsc::Sender; +use spawned_concurrency::threads::{self as concurrency, Process, ProcessInfo}; +use spawned_rt::threads::mpsc::Sender; use crate::messages::Message; diff --git a/examples/updater/src/main.rs b/examples/updater/src/main.rs index fa63627..5119b9e 100644 --- a/examples/updater/src/main.rs +++ b/examples/updater/src/main.rs @@ -10,8 +10,8 @@ use std::{thread, time::Duration}; use messages::UpdaterOutMessage; use server::{UpdateServerState, UpdaterServer}; -use spawned_concurrency::r#async::GenServer as _; -use spawned_rt::r#async as rt; +use spawned_concurrency::tasks::GenServer as _; +use spawned_rt::tasks as rt; fn main() { rt::run(async { diff --git a/examples/updater/src/server.rs b/examples/updater/src/server.rs index d530497..c600ed9 100644 --- a/examples/updater/src/server.rs +++ b/examples/updater/src/server.rs @@ -1,9 +1,9 @@ use std::time::Duration; -use spawned_concurrency::r#async::{ +use spawned_concurrency::tasks::{ send_after, CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, }; -use spawned_rt::r#async::mpsc::Sender; +use spawned_rt::tasks::mpsc::Sender; use crate::messages::{UpdaterInMessage as InMessage, UpdaterOutMessage as OutMessage}; diff --git a/examples/updater_sync/Cargo.toml b/examples/updater_threads/Cargo.toml similarity index 84% rename from examples/updater_sync/Cargo.toml rename to examples/updater_threads/Cargo.toml index 76ae699..7266750 100644 --- a/examples/updater_sync/Cargo.toml +++ b/examples/updater_threads/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "updater_sync" +name = "updater_threads" version = "0.1.0" edition = "2021" @@ -11,5 +11,5 @@ reqwest = { version = "0.11", features = ["blocking"] } futures = "0.3.1" [[bin]] -name = "updater_sync" +name = "updater_threads" path = "src/main.rs" \ No newline at end of file diff --git a/examples/updater_sync/src/main.rs b/examples/updater_threads/src/main.rs similarity index 90% rename from examples/updater_sync/src/main.rs rename to examples/updater_threads/src/main.rs index 441968a..64236be 100644 --- a/examples/updater_sync/src/main.rs +++ b/examples/updater_threads/src/main.rs @@ -10,8 +10,8 @@ use std::{thread, time::Duration}; use messages::UpdaterOutMessage; use server::{UpdateServerState, UpdaterServer}; -use spawned_concurrency::sync::GenServer as _; -use spawned_rt::sync as rt; +use spawned_concurrency::threads::GenServer as _; +use spawned_rt::threads as rt; fn main() { rt::run(|| { diff --git a/examples/updater_sync/src/messages.rs b/examples/updater_threads/src/messages.rs similarity index 100% rename from examples/updater_sync/src/messages.rs rename to examples/updater_threads/src/messages.rs diff --git a/examples/updater_sync/src/server.rs b/examples/updater_threads/src/server.rs similarity index 95% rename from examples/updater_sync/src/server.rs rename to examples/updater_threads/src/server.rs index 48bbfa3..cbd9643 100644 --- a/examples/updater_sync/src/server.rs +++ b/examples/updater_threads/src/server.rs @@ -1,9 +1,9 @@ use std::time::Duration; -use spawned_concurrency::sync::{ +use spawned_concurrency::threads::{ send_after, CallResponse, CastResponse, GenServer, GenServerHandle, GenServerInMsg, }; -use spawned_rt::sync::{block_on, mpsc::Sender}; +use spawned_rt::threads::{block_on, mpsc::Sender}; use crate::messages::{UpdaterInMessage as InMessage, UpdaterOutMessage as OutMessage}; diff --git a/rt/src/lib.rs b/rt/src/lib.rs index b5e318e..dc56e81 100644 --- a/rt/src/lib.rs +++ b/rt/src/lib.rs @@ -7,6 +7,6 @@ //! Currently, only a very limited set of tokio functionality is reexported. We may want to //! extend this functionality as needed. -pub mod r#async; -pub mod sync; +pub mod tasks; +pub mod threads; mod tracing; diff --git a/rt/src/async/mod.rs b/rt/src/tasks/mod.rs similarity index 79% rename from rt/src/async/mod.rs rename to rt/src/tasks/mod.rs index 2a4f974..5cb9a41 100644 --- a/rt/src/async/mod.rs +++ b/rt/src/tasks/mod.rs @@ -11,10 +11,10 @@ mod tokio; use crate::tracing::init_tracing; -pub use crate::r#async::tokio::mpsc; -pub use crate::r#async::tokio::oneshot; -pub use crate::r#async::tokio::sleep; -pub use crate::r#async::tokio::{spawn, JoinHandle, Runtime}; +pub use crate::tasks::tokio::mpsc; +pub use crate::tasks::tokio::oneshot; +pub use crate::tasks::tokio::sleep; +pub use crate::tasks::tokio::{spawn, JoinHandle, Runtime}; use std::future::Future; pub fn run(future: F) -> F::Output { diff --git a/rt/src/async/tokio/mod.rs b/rt/src/tasks/tokio/mod.rs similarity index 100% rename from rt/src/async/tokio/mod.rs rename to rt/src/tasks/tokio/mod.rs diff --git a/rt/src/async/tokio/mpsc.rs b/rt/src/tasks/tokio/mpsc.rs similarity index 100% rename from rt/src/async/tokio/mpsc.rs rename to rt/src/tasks/tokio/mpsc.rs diff --git a/rt/src/async/tokio/oneshot.rs b/rt/src/tasks/tokio/oneshot.rs similarity index 100% rename from rt/src/async/tokio/oneshot.rs rename to rt/src/tasks/tokio/oneshot.rs diff --git a/rt/src/sync/mod.rs b/rt/src/threads/mod.rs similarity index 83% rename from rt/src/sync/mod.rs rename to rt/src/threads/mod.rs index 30c0217..d7c8f7d 100644 --- a/rt/src/sync/mod.rs +++ b/rt/src/threads/mod.rs @@ -6,7 +6,7 @@ pub use std::{ thread::{sleep, spawn, JoinHandle}, }; -use crate::{r#async::Runtime, tracing::init_tracing}; +use crate::{tasks::Runtime, tracing::init_tracing}; pub fn run(f: fn()) { init_tracing(); diff --git a/rt/src/sync/mpsc.rs b/rt/src/threads/mpsc.rs similarity index 100% rename from rt/src/sync/mpsc.rs rename to rt/src/threads/mpsc.rs diff --git a/rt/src/sync/oneshot.rs b/rt/src/threads/oneshot.rs similarity index 100% rename from rt/src/sync/oneshot.rs rename to rt/src/threads/oneshot.rs From fbf2ef4ac12080fcfe719c8b5049ca90a1110227 Mon Sep 17 00:00:00 2001 From: Esteban Dimitroff Hodi Date: Tue, 27 May 2025 11:48:23 -0300 Subject: [PATCH 15/15] Modules documentation and README improvements --- README.md | 9 ++++++++- concurrency/README.md | 4 ++++ concurrency/src/lib.rs | 4 ++-- concurrency/src/tasks/mod.rs | 4 ++-- concurrency/src/threads/mod.rs | 4 ++-- examples/README.md | 12 ++++++++---- rt/src/threads/mod.rs | 2 ++ rt/src/threads/mpsc.rs | 2 +- rt/src/threads/oneshot.rs | 2 +- 9 files changed, 30 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 9037298..74cc3ae 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Spawned -Simple library for concurrent Rust. +Library for concurrent Rust. # Goals: @@ -7,10 +7,17 @@ Simple library for concurrent Rust. - Set coding guidelines to apply along LambdaClass repositories and codebase. - Starting point to ideate what we want for Concrete. +# Versions: + +Two versions exist in their own submodules: +- threads: no use of async/await. Just IO threads code. +- tasks: a runtime is required to run async/await code. The runtime is selected in `spawned_rt::tasks` module that abstracts it. + # Inspiration: - [Erlang](https://www.erlang.org/) - [Commonware.xyz](https://commonware.xyz) - [Ractor](https://slawlor.github.io/ractor/) +- [Actors with Tokio](https://ryhl.io/blog/actors-with-tokio/) - [Vale.dev](https://vale.dev/) - [Gleam](https://gleam.run/) \ No newline at end of file diff --git a/concurrency/README.md b/concurrency/README.md index ff74e4d..ef8799e 100644 --- a/concurrency/README.md +++ b/concurrency/README.md @@ -1,3 +1,7 @@ # Spawned concurrency Some basic traits and structs to implement à-la-Erlang concurrent code. +Currently two versions: + +- threads: no use of async/await. Just IO threads code +- tasks: a runtime is required to run async/await code. It uses `spawned_rt::tasks` module that abstracts the runtime. diff --git a/concurrency/src/lib.rs b/concurrency/src/lib.rs index ca158a2..28c3ee2 100644 --- a/concurrency/src/lib.rs +++ b/concurrency/src/lib.rs @@ -1,5 +1,5 @@ -//! λ-kit concurrency -//! Some basic traits and structs to implement À-la-Erlang concurrent code. +//! spawned concurrency +//! Some basic traits and structs to implement concurrent code à-la-Erlang. pub mod tasks; pub mod threads; diff --git a/concurrency/src/tasks/mod.rs b/concurrency/src/tasks/mod.rs index 38a3174..93bcedb 100644 --- a/concurrency/src/tasks/mod.rs +++ b/concurrency/src/tasks/mod.rs @@ -1,5 +1,5 @@ -//! λ-kit concurrency -//! Some basic traits and structs to implement À-la-Erlang concurrent code. +//! spawned concurrency +//! Runtime tasks-based traits and structs to implement concurrent code à-la-Erlang. mod error; mod gen_server; diff --git a/concurrency/src/threads/mod.rs b/concurrency/src/threads/mod.rs index e826566..858dd52 100644 --- a/concurrency/src/threads/mod.rs +++ b/concurrency/src/threads/mod.rs @@ -1,5 +1,5 @@ -//! λ-kit concurrency -//! Some basic traits and structs to implement À-la-Erlang concurrent code. +//! spawned concurrency +//! IO threads-based traits and structs to implement concurrent code à-la-Erlang. mod error; mod gen_server; diff --git a/examples/README.md b/examples/README.md index d944f56..97b021d 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,7 +1,11 @@ # Spawned examples Some examples to test runtime and concurrency: -- ping_pong: Simple example to test Process abstraction. -- name_server: Simple example to test GenServer abstraction. -- bank: A bit more complex example for GenServer. - +- ping_pong: Simple example to test Process abstraction using `tasks` implementation. +- ping_pong_threads: ping_pong example on `threads` implementation. +- name_server: Simple example to test GenServer abstraction using `tasks` implementation. +- name_server_with_error: Same name_server example with a deliverate error to check catching mechanism to prevent panicking on callback code. +- bank: A bit more complex example for GenServer using `tasks` implementation. +- bank_threads: bank example on `threads` implementation. +- updater: A "live" process that checks an url periodicaly using `tasks` implementation. +- updater_threads: updater example on `threads` implementation. \ No newline at end of file diff --git a/rt/src/threads/mod.rs b/rt/src/threads/mod.rs index d7c8f7d..cd8b543 100644 --- a/rt/src/threads/mod.rs +++ b/rt/src/threads/mod.rs @@ -1,3 +1,5 @@ +//! IO-threads based module to support shared behavior with task based version. + pub mod mpsc; pub mod oneshot; diff --git a/rt/src/threads/mpsc.rs b/rt/src/threads/mpsc.rs index c486472..c5b140a 100644 --- a/rt/src/threads/mpsc.rs +++ b/rt/src/threads/mpsc.rs @@ -1,3 +1,3 @@ -//! Tokio.rs reexports to prevent tokio dependencies within external code +//! non-async replacement for mpsc channels pub use std::sync::mpsc::{channel, Receiver, SendError, Sender}; diff --git a/rt/src/threads/oneshot.rs b/rt/src/threads/oneshot.rs index 973f250..ba0accb 100644 --- a/rt/src/threads/oneshot.rs +++ b/rt/src/threads/oneshot.rs @@ -1,3 +1,3 @@ -//! Tokio.rs reexports to prevent tokio dependencies within external code +//! non-async replacement for oneshot channels pub use crossbeam::{crossbeam_channel::unbounded as channel, Receiver, Sender};