From f673673dac883dfadba27b1029be0e3cd989a184 Mon Sep 17 00:00:00 2001 From: Jeff Baskin Date: Thu, 17 Jul 2025 09:12:23 -0400 Subject: [PATCH] Setting up message routing. --- Cargo.lock | 204 +++++++++++++++++++++++++++---------------------- src/doctype.rs | 5 +- src/message.rs | 203 ++++++++++++++++++++++++++++++++++-------------- src/session.rs | 12 ++- 4 files changed, 271 insertions(+), 153 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8625414..a92590c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 4 +version = 3 [[package]] name = "addr2line" @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "android-tzdata" @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", @@ -49,44 +49,44 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys 0.59.0", ] [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" @@ -144,9 +144,9 @@ dependencies = [ [[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", @@ -159,15 +159,15 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytes" @@ -177,18 +177,18 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.21" +version = "1.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" +checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" dependencies = [ "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "chrono" @@ -206,9 +206,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.37" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" dependencies = [ "clap_builder", "clap_derive", @@ -216,9 +216,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.37" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" dependencies = [ "anstream", "anstyle", @@ -228,9 +228,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.32" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ "heck", "proc-macro2", @@ -240,15 +240,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "cookie" @@ -339,9 +339,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", @@ -428,12 +428,12 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "hyper", @@ -466,6 +466,17 @@ dependencies = [ "cc", ] +[[package]] +name = "io-uring" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -499,15 +510,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.172" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -527,9 +538,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "mime" @@ -539,22 +550,22 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -604,10 +615,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] -name = "parking_lot" -version = "0.12.3" +name = "once_cell_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -615,9 +632,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", @@ -688,30 +705,30 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "redox_syscall" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ "bitflags", ] [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" @@ -802,24 +819,21 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -833,9 +847,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.101" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -881,17 +895,19 @@ dependencies = [ [[package]] name = "tokio" -version = "1.45.0" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", + "slab", "socket2", "tokio-macros", "windows-sys 0.52.0", @@ -965,9 +981,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] @@ -986,11 +1002,13 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ "getrandom", + "js-sys", + "wasm-bindgen", ] [[package]] @@ -1001,9 +1019,9 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -1074,9 +1092,9 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.61.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement", "windows-interface", @@ -1109,24 +1127,24 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-result" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ "windows-link", ] diff --git a/src/doctype.rs b/src/doctype.rs index d0ed682..fbfe0ce 100644 --- a/src/doctype.rs +++ b/src/doctype.rs @@ -1,5 +1,8 @@ use crate::queue::{Message, MsgType, Queue}; -use std::{sync::mpsc::{channel, Receiver}, thread::spawn}; +use std::{ + sync::mpsc::{channel, Receiver}, + thread::spawn, +}; const RESPONDS_TO: [MsgType; 0] = []; diff --git a/src/message.rs b/src/message.rs index 6719d82..fd1f8a7 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1,39 +1,47 @@ -use std::{collections::HashMap, sync::{Arc, RwLock, mpsc::{Sender, Receiver, channel}}}; +use crate::field::Field; +use std::{ + collections::HashMap, + sync::{ + mpsc::{channel, Receiver, Sender}, + Arc, RwLock, + }, +}; use uuid::Uuid; #[derive(Clone, Debug)] enum MTTError { DocumentAlreadyExists(String), DocumentNotFound(String), + RouteNoListeners, } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, Eq, Hash, PartialEq)] enum Action { - New, + NewDocumentType, Query, Reply, Update, } #[derive(Clone)] -enum DocumentID { +enum NameID { ID(Uuid), Name(String), } -impl From<&str> for DocumentID { +impl From<&str> for NameID { fn from(value: &str) -> Self { Self::Name(value.to_string()) } } -impl From for DocumentID { +impl From for NameID { fn from(value: String) -> Self { Self::Name(value) } } -impl From for DocumentID { +impl From for NameID { fn from(value: Uuid) -> Self { Self::ID(value) } @@ -42,17 +50,20 @@ impl From for DocumentID { #[derive(Clone)] struct Message { msg_id: Uuid, - document_id: DocumentID, + document_id: NameID, action: Action, //instructions: ?, } impl Message { - fn new(doc_id: D, action: Action) -> Self where D: Into { + fn new(doc_id: D, action: Action) -> Self + where + D: Into, + { Self { msg_id: Uuid::new_v4(), document_id: doc_id.into(), - action: action + action: action, } } @@ -60,16 +71,12 @@ impl Message { &self.msg_id } - fn get_document_id(&self) -> &DocumentID { + fn get_document_id(&self) -> &NameID { &self.document_id } - fn reply(&self) -> Self { - Self { - msg_id: self.msg_id.clone(), - document_id: DocumentID::Name("fred".to_string()), - action: Action::Update, - } + fn get_action(&self) -> &Action { + &self.action } } @@ -81,12 +88,12 @@ mod messages { fn can_the_document_be_a_stringi_reference() { let dts = ["one", "two"]; for document in dts.into_iter() { - let msg = Message::new(document, Action::New); + let msg = Message::new(document, Action::NewDocumentType); match msg.get_document_id() { - DocumentID::ID(_) => unreachable!("should have been a string id"), - DocumentID::Name(data) => assert_eq!(data, document), + NameID::ID(_) => unreachable!("should have been a string id"), + NameID::Name(data) => assert_eq!(data, document), } - assert_eq!(msg.action, Action::New); + assert_eq!(msg.get_action(), &Action::NewDocumentType); } } @@ -96,10 +103,10 @@ mod messages { for document in dts.into_iter() { let msg = Message::new(document.clone(), Action::Update); match msg.get_document_id() { - DocumentID::ID(_) => unreachable!("should have been a string id"), - DocumentID::Name(data) => assert_eq!(data, &document), + NameID::ID(_) => unreachable!("should have been a string id"), + NameID::Name(data) => assert_eq!(data, &document), } - assert_eq!(msg.action, Action::Update); + assert_eq!(msg.get_action(), &Action::Update); } } @@ -108,8 +115,8 @@ mod messages { let document = Uuid::new_v4(); let msg = Message::new(document.clone(), Action::Query); match msg.get_document_id() { - DocumentID::ID(data) => assert_eq!(data, &document), - DocumentID::Name(_) => unreachable!("should have been an id"), + NameID::ID(data) => assert_eq!(data, &document), + NameID::Name(_) => unreachable!("should have been an id"), } assert_eq!(msg.action, Action::Query); } @@ -118,77 +125,107 @@ mod messages { fn is_the_message_id_random() { let mut ids: Vec = Vec::new(); for _ in 0..5 { - let msg = Message::new("tester", Action::New); + let msg = Message::new("tester", Action::NewDocumentType); let id = msg.get_message_id().clone(); assert!(!ids.contains(&id), "{:?} containts {}", ids, id); ids.push(id); } } +} - #[test] - fn does_the_message_reply_have_the_same_message_id() { - let msg = Message::new("tester", Action::New); - let reply = msg.reply(); - assert_eq!(reply.get_message_id(), msg.get_message_id()); +#[derive(Eq, Hash, PartialEq)] +struct Route { + action: Action, + doc_type: Option, +} + +impl Route { + fn new(doc_type: Option, action: Action) -> Self { + Self { + action: action, + doc_type: doc_type, + } } } struct QueueData { senders: HashMap>, names: HashMap, + routes: HashMap, } impl QueueData { fn new() -> Self { - Self { + Self { senders: HashMap::new(), names: HashMap::new(), + routes: HashMap::new(), } } fn register(&mut self, name: String, tx: Sender) -> Result { match self.names.get(&name) { Some(_) => return Err(MTTError::DocumentAlreadyExists(name)), - None => {}, + None => {} + } + let mut id = Uuid::new_v4(); + while self.senders.contains_key(&id) { + id = Uuid::new_v4(); } - let id = Uuid::new_v4(); self.senders.insert(id.clone(), tx); self.names.insert(name, id.clone()); Ok(id) } fn send(&self, msg: Message) -> Result<(), MTTError> { - let tx = match msg.get_document_id() { - DocumentID::ID(id) => self.senders.get(id).unwrap(), - DocumentID::Name(name) => { - let docid = match self.names.get(name) { - Some(id) => id, - None => { - return Err(MTTError::DocumentNotFound(name.to_string())); - &Uuid::new_v4() - } - }; - self.senders.get(docid).unwrap() + let doc_id = match msg.get_document_id() { + NameID::Name(name) => match self.names.get(name) { + Some(id) => Some(id.clone()), + None => return Err(MTTError::DocumentNotFound(name.clone())), }, + NameID::ID(id) => Some(id.clone()), }; + let route = Route::new(doc_id, msg.get_action().clone()); + let sender_id = match self.routes.get(&route) { + Some(sender_id) => sender_id, + None => return Ok(()), + }; + let tx = self.senders.get(sender_id).unwrap(); tx.send(msg).unwrap(); Ok(()) } + + fn add_route( + &mut self, + sender_id: &Uuid, + doc_type: Option, + action: Action, + ) -> Result<(), MTTError> { + let doc_id = match doc_type { + Some(name) => Some(self.names.get(&name).unwrap().clone()), + None => None, + }; + let route = Route::new(doc_id, action); + self.routes.insert(route, sender_id.clone()); + Ok(()) + } } #[cfg(test)] mod queuedatas { use super::*; - use std::time::Duration; + use std::{sync::mpsc::RecvTimeoutError, time::Duration}; static TIMEOUT: Duration = Duration::from_millis(500); #[test] fn can_a_new_document_type_be_rgistered() { let name = Uuid::new_v4().to_string(); + let action = Action::Query; let (tx, rx) = channel(); let mut queuedata = QueueData::new(); let id = queuedata.register(name.clone(), tx).unwrap(); + queuedata.add_route(&id, Some(name.clone()), action); let msg = Message::new(name.clone(), Action::Query); queuedata.send(msg.clone()).unwrap(); let result = rx.recv_timeout(TIMEOUT).unwrap(); @@ -228,6 +265,62 @@ mod queuedatas { }, } } + + #[test] + fn is_send_okay_if_no_one_is_listening() { + let mut queuedata = QueueData::new(); + let name = "something"; + let (tx, _) = channel(); + queuedata.register(name.to_string(), tx).unwrap(); + let msg = Message::new("something", Action::NewDocumentType); + match queuedata.send(msg) { + Ok(_) => {} + Err(err) => unreachable!("got {:?}: should not error", err), + } + } + + #[test] + fn can_certain_messages_be_ignored() { + let mut queuedata = QueueData::new(); + let doctype = "test"; + let (tx, rx) = channel(); + let id = queuedata.register(doctype.to_string(), tx).unwrap(); + queuedata.add_route(&id, Some(doctype.to_string()), Action::Query); + let msg = Message::new(doctype, Action::Query); + queuedata.send(msg.clone()).unwrap(); + let result = rx.recv_timeout(TIMEOUT).unwrap(); + assert_eq!(result.get_message_id(), msg.get_message_id()); + let msg = Message::new(doctype, Action::Reply); + match rx.recv_timeout(TIMEOUT) { + Ok(_) => unreachable!("should timeout"), + Err(err) => match err { + RecvTimeoutError::Timeout => {} + _ => unreachable!("should timeout"), + }, + } + } + + /* + #[test] + fn can_messages_be_directed() { + let mut queuedata = QueueData::new(); + let (tx1, rx1) = channel(); + let (tx2, rx2) = channel(); + let id1 = queuedata.register("task".to_string(), tx1); + let id2 = queuedata.register("work".to_string(), tx2); + let msg = Message::new("task".to_string(), Action::Query); + queuedata.send(msg.clone()).unwrap(); + let result = rx1.recv_timeout(TIMEOUT).unwrap(); + assert_eq!(result.get_message_id(), msg.get_message_id()); + match rx2.recv_timeout(TIMEOUT) { + Ok(_) => unreachable!("should timeout"), + Err(err) => match err { + RecvTimeoutError::Timeout => {}, + _ => unreachable!("should timeout"), + } + } + } + */ } #[derive(Clone)] @@ -260,11 +353,9 @@ impl Document { Self {} } - fn start(queue: Queue) { - } + fn start(queue: Queue) {} - fn listen(&self) { - } + fn listen(&self) {} } #[cfg(test)] @@ -274,13 +365,13 @@ mod documents { #[test] fn create_document_creation() { let queue = Queue::new(); - Document::start(queue); + Document::start(queue.clone()); } } -// Create a double hash map. posswible names that leads to an id that is int eh ids -// \and the second is the id and the sender to be used.and a third for who wants to -// listen to what. +// Create a double hash map. posswible names that leads to an id that is int eh ids +// \and the second is the id and the sender to be used.and a third for who wants to +// listen to what. // // The queue has a read write lock on the abbove strucutee. A clone of this is given to -// every process. +// every process. diff --git a/src/session.rs b/src/session.rs index 4d20176..22b371b 100644 --- a/src/session.rs +++ b/src/session.rs @@ -218,7 +218,7 @@ pub mod sessions { let mut msg = Message::new(MsgType::SessionValidate); match lang { Some(data) => msg.add_data("language", data.clone()), - None => {}, + None => {} } queue.send(msg.clone()).unwrap(); let holder = rx.recv_timeout(TIMEOUT).unwrap(); @@ -357,7 +357,10 @@ pub mod sessions { let reply = rx.recv_timeout(TIMEOUT).unwrap(); assert_eq!(reply.get_id(), msg.get_id()); assert_eq!(reply.get_msg_type(), &MsgType::Session); - assert_eq!(reply.get_data("language").unwrap().to_language().unwrap(), DEFAULT_LANG); + assert_eq!( + reply.get_data("language").unwrap().to_language().unwrap(), + DEFAULT_LANG + ); } #[test] @@ -372,7 +375,10 @@ pub mod sessions { let reply = rx.recv_timeout(TIMEOUT).unwrap(); assert_eq!(reply.get_id(), msg.get_id()); assert_eq!(reply.get_msg_type(), &MsgType::Session); - assert_eq!(reply.get_data("language").unwrap().to_language().unwrap(), lang); + assert_eq!( + reply.get_data("language").unwrap().to_language().unwrap(), + lang + ); } } }