Index: Cargo.toml ================================================================== --- Cargo.toml +++ Cargo.toml @@ -1,8 +1,8 @@ [package] name = "lstngrp" -version = "0.0.2" +version = "0.0.3" edition = "2021" license = "0BSD" # https://crates.io/category_slugs categories = [ "network-programming", "asynchronous" ] keywords = [ "network", "server", "listen", "protwrap" ] @@ -11,11 +11,13 @@ rust-version = "1.62" exclude = [ ".fossil-settings", ".efiles", ".fslckout", + "examples", "www", + "bacon.toml", "rustfmt.toml" ] # https://doc.rust-lang.org/cargo/reference/manifest.html#the-badges-section [badges] @@ -27,14 +29,20 @@ killswitch = { version = "0.4.2" } parking_lot = { version = "0.12.3" } protwrap = { version = "0.3.0", features = [ "tls", "tokio" ] } -tokio = { version = "1.39.2", features = [ +tokio = { version = "1.40.0", features = [ "macros", "net", "rt", "sync" ] } [dev-dependencies] -tokio = { version = "1.39.2", features = [ +tokio = { version = "1.40.0", features = [ "io-util", "rt-multi-thread", "time" ] } +[lints.clippy] +all = { level = "deny", priority = -1 } +pedantic = { level = "warn", priority = -1 } +nursery = { level = "warn", priority = -1 } +cargo = { level = "warn", priority = -1 } + Index: README.md ================================================================== --- README.md +++ README.md @@ -1,5 +1,5 @@ -# listengroup +# lstngrp -`ListenGroup` is meant to collect a group of network listeners into a single +`ListenerGroup` is meant to collect a group of network listeners into a single entity, and help track connections made against those listeners. ADDED bacon.toml Index: bacon.toml ================================================================== --- /dev/null +++ bacon.toml @@ -0,0 +1,105 @@ +# This is a configuration file for the bacon tool +# +# Bacon repository: https://github.com/Canop/bacon +# Complete help on configuration: https://dystroy.org/bacon/config/ +# You can also check bacon's own bacon.toml file +# as an example: https://github.com/Canop/bacon/blob/main/bacon.toml + +# For information about clippy lints, see: +# https://github.com/rust-lang/rust-clippy/blob/master/README.md + +#default_job = "check" +default_job = "clippy-all" + +[jobs.check] +command = ["cargo", "check", "--color", "always"] +need_stdout = false + +[jobs.check-all] +command = ["cargo", "check", "--all-targets", "--color", "always"] +need_stdout = false + +# Run clippy on the default target +[jobs.clippy] +command = [ + "cargo", "clippy", + "--color", "always", +] +need_stdout = false + +# Run clippy on all targets +# To disable some lints, you may change the job this way: +# [jobs.clippy-all] +# command = [ +# "cargo", "clippy", +# "--all-targets", +# "--color", "always", +# "--", +# "-A", "clippy::bool_to_int_with_if", +# "-A", "clippy::collapsible_if", +# "-A", "clippy::derive_partial_eq_without_eq", +# ] +# need_stdout = false +[jobs.clippy-all] +command = [ + "cargo", "clippy", + "--all-targets", + "--color", "always", +] +need_stdout = false + +# This job lets you run +# - all tests: bacon test +# - a specific test: bacon test -- config::test_default_files +# - the tests of a package: bacon test -- -- -p config +[jobs.test] +command = [ + "cargo", "test", "--color", "always", + "--", "--color", "always", # see https://github.com/Canop/bacon/issues/124 +] +need_stdout = true + +[jobs.doc] +command = ["cargo", "doc", "--color", "always", "--no-deps"] +need_stdout = false + +# If the doc compiles, then it opens in your browser and bacon switches +# to the previous job +[jobs.doc-open] +command = ["cargo", "doc", "--color", "always", "--no-deps", "--open"] +need_stdout = false +on_success = "back" # so that we don't open the browser at each change + +# You can run your application and have the result displayed in bacon, +# *if* it makes sense for this crate. +# Don't forget the `--color always` part or the errors won't be +# properly parsed. +# If your program never stops (eg a server), you may set `background` +# to false to have the cargo run output immediately displayed instead +# of waiting for program's end. +[jobs.run] +command = [ + "cargo", "run", + "--color", "always", + # put launch parameters for your program behind a `--` separator +] +need_stdout = true +allow_warnings = true +background = true + +# This parameterized job runs the example of your choice, as soon +# as the code compiles. +# Call it as +# bacon ex -- my-example +[jobs.ex] +command = ["cargo", "run", "--color", "always", "--example"] +need_stdout = true +allow_warnings = true + +# You may define here keybindings that would be specific to +# a project, for example a shortcut to launch a specific job. +# Shortcuts to internal functions (scrolling, toggling, etc.) +# should go in your personal global prefs.toml file instead. +[keybindings] +# alt-m = "job:my-job" +c = "job:clippy-all" # comment this to have 'c' run clippy on only the default target Index: examples/per_listener_ctx.rs ================================================================== --- examples/per_listener_ctx.rs +++ examples/per_listener_ctx.rs @@ -50,11 +50,11 @@ _listener: &Listener, lid: Self::ListenIdent, err: std::io::Error ) { // An interface listener failed to bind to its interface - println!("Failed to set up listener lid={lid}; {}", err); + println!("Failed to set up listener lid={lid}; {err}"); // Note: Thanks to add_listener_with_cb() being used to register listeners // with a callback, where the callback is responsible for registering // the listener-specific context, we don't need to worry about // deregistering the context here. @@ -83,11 +83,11 @@ lid, ci.id.val() ); Self::ConnHandler { listen_id: lid, - conn_id: ci.id.clone() + conn_id: ci.id } } } @@ -137,45 +137,39 @@ // Kick off a listener with id 1, which is a TCP localhost:8080 listener let id = 1; let listener = Listener::from_str("127.0.0.1:8080").unwrap(); let lm = Arc::clone(&lmap); - lgrp - .add_listener_with_cb(id, listener, move |lid| { - let name = format!("Listener {}", id); - lm.lock().insert(lid, ListenCtx { name }); - }) - .await; + lgrp.add_listener_with_cb(id, listener, move |lid| { + let name = format!("Listener {id}"); + lm.lock().insert(lid, ListenCtx { name }); + }); // Give listeners a second to start up tokio::time::sleep(std::time::Duration::from_millis(200)).await; // Kick off a listener with id 9, which is a TCP localhost:8080 listener, // which should fail because it is bound by listener with id 1. let id = 9; let listener = Listener::from_str("127.0.0.1:8080").unwrap(); let lm = Arc::clone(&lmap); - lgrp - .add_listener_with_cb(id, listener, move |lid| { - let name = format!("Listener {}", id); - lm.lock().insert(lid, ListenCtx { name }); - }) - .await; + lgrp.add_listener_with_cb(id, listener, move |lid| { + let name = format!("Listener {id}"); + lm.lock().insert(lid, ListenCtx { name }); + }); // Give listener a second to start up tokio::time::sleep(std::time::Duration::from_millis(200)).await; // Kick off a listener with id 3, which is a TCP localhost:8081 listener let id = 2; let listener = Listener::from_str("127.0.0.1:8081").unwrap(); let lm = Arc::clone(&lmap); - lgrp - .add_listener_with_cb(id, listener, move |lid| { - let name = format!("Listener {}", id); - lm.lock().insert(lid, ListenCtx { name }); - }) - .await; + lgrp.add_listener_with_cb(id, listener, move |lid| { + let name = format!("Listener {id}"); + lm.lock().insert(lid, ListenCtx { name }); + }); // Give listener a second to start up tokio::time::sleep(std::time::Duration::from_millis(200)).await; Index: examples/simple.rs ================================================================== --- examples/simple.rs +++ examples/simple.rs @@ -25,11 +25,11 @@ &self, _listener: &Listener, lid: Self::ListenIdent, err: std::io::Error ) { - println!("Failed to set up listener {}; {}", lid, err); + println!("Failed to set up listener {lid}; {err}"); } async fn unbound(&self, _listener: &Listener, _lid: Self::ListenIdent) { //println!("Listener {} has been unbound", lctx.listen_id); } @@ -44,11 +44,11 @@ lid, ci.id.val() ); Self::ConnHandler { listen_id: lid, - conn_id: ci.id.clone() + conn_id: ci.id } } } @@ -89,29 +89,29 @@ let lgrp = ListenerGroup::new(handler); // Kick off a listener with id 1, which is a TCP localhost:8080 listener let id = 1; let listener = Listener::from_str("127.0.0.1:8080").unwrap(); - lgrp.add_listener(id, listener).await; + lgrp.add_listener(id, listener); // Give listeners a second to start up tokio::time::sleep(std::time::Duration::from_millis(200)).await; // Kick off a listener with id 9, which is a TCP localhost:8080 listener, // which should fail because it is bound by listener with id 1. let id = 9; let listener = Listener::from_str("127.0.0.1:8080").unwrap(); - lgrp.add_listener(id, listener).await; + lgrp.add_listener(id, listener); // Give listener a second to start up tokio::time::sleep(std::time::Duration::from_millis(200)).await; // Kick off a listener with id 3, which is a TCP localhost:8081 listener let id = 2; let listener = Listener::from_str("127.0.0.1:8081").unwrap(); - lgrp.add_listener(id, listener).await; + lgrp.add_listener(id, listener); // Give listener a second to start up tokio::time::sleep(std::time::Duration::from_millis(200)).await; Index: src/conn.rs ================================================================== --- src/conn.rs +++ src/conn.rs @@ -15,11 +15,11 @@ use super::{ConnHandler, ConnInfo}; /// Internal per-connection data. -pub(crate) struct ConnectionData