veilid_tools/
lib.rs

1//! # Veilid Tools
2//!
3//! A collection of baseline tools for Rust development use by Veilid and Veilid-enabled Rust applications
4//!
5//! These are used by `veilid-core`, `veilid-server`, `veilid-cli` and may be used by any other applications
6//! that link in `veilid-core` if a common baseline of functionality is desired. Extending this crate with new
7//! utility functions is encouraged rather than adding 'common' functionality to `veilid-core`, allowing it to
8//! remain free of boilerplate and utility classes that could be reused elsewhere.
9//!
10//! Everything added to this crate must be extensively unit-tested.
11//!
12//! ## Features
13//!
14//! The default `veilid-tools` configurations are:
15//!
16//! * `default` - Uses `tokio` as the async runtime
17//!
18//! If you use `--no-default-features`, you can switch to other runtimes:
19//!
20//! * `rt-async-std` - Uses `async-std` as the async runtime
21//! * `rt-wasm-bindgen` - When building for the `wasm32` architecture, use this to enable `wasm-bindgen-futures` as the async runtime
22//!
23#![deny(clippy::all)]
24#![allow(clippy::comparison_chain, clippy::upper_case_acronyms)]
25#![deny(unused_must_use)]
26
27pub mod assembly_buffer;
28pub mod async_peek_stream;
29pub mod async_tag_lock;
30pub mod clone_stream;
31pub mod deferred_stream_processor;
32pub mod event_bus;
33pub mod eventual;
34pub mod eventual_base;
35pub mod eventual_value;
36pub mod eventual_value_clone;
37pub mod future_queue;
38pub mod interval;
39pub mod ip_addr_port;
40pub mod ip_extra;
41pub mod ipc;
42pub mod must_join_handle;
43pub mod must_join_single_future;
44pub mod mutable_future;
45pub mod network_interfaces;
46pub mod network_result;
47pub mod random;
48pub mod single_shot_eventual;
49pub mod sleep;
50#[cfg(not(all(target_arch = "wasm32", target_os = "unknown")))]
51pub mod socket_tools;
52pub mod spawn;
53pub mod split_url;
54pub mod startup_lock;
55pub mod static_string_table;
56pub mod tick_task;
57pub mod timeout;
58pub mod timeout_or;
59pub mod timestamp;
60pub mod tools;
61#[cfg(feature = "virtual-network")]
62pub mod virtual_network;
63#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
64pub mod wasm;
65
66pub type PinBox<T> = Pin<Box<T>>;
67pub type PinBoxFuture<T> = PinBox<dyn Future<Output = T> + 'static>;
68pub type PinBoxFutureLifetime<'a, T> = PinBox<dyn Future<Output = T> + 'a>;
69pub type SendPinBoxFuture<T> = PinBox<dyn Future<Output = T> + Send + 'static>;
70pub type SendPinBoxFutureLifetime<'a, T> = PinBox<dyn Future<Output = T> + Send + 'a>;
71
72#[doc(no_inline)]
73pub use std::borrow::{Cow, ToOwned};
74#[doc(no_inline)]
75pub use std::boxed::Box;
76#[doc(no_inline)]
77pub use std::cell::RefCell;
78#[doc(no_inline)]
79pub use std::cmp;
80#[doc(no_inline)]
81pub use std::collections::btree_map::BTreeMap;
82#[doc(no_inline)]
83pub use std::collections::btree_set::BTreeSet;
84#[doc(no_inline)]
85pub use std::collections::hash_map::HashMap;
86#[doc(no_inline)]
87pub use std::collections::hash_set::HashSet;
88#[doc(no_inline)]
89pub use std::collections::LinkedList;
90#[doc(no_inline)]
91pub use std::collections::VecDeque;
92#[doc(no_inline)]
93pub use std::convert::{TryFrom, TryInto};
94#[doc(no_inline)]
95pub use std::fmt;
96#[doc(no_inline)]
97pub use std::future::Future;
98#[doc(no_inline)]
99pub use std::mem;
100#[doc(no_inline)]
101pub use std::net::{
102    IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs,
103};
104#[doc(no_inline)]
105pub use std::ops::{Fn, FnMut, FnOnce};
106#[doc(no_inline)]
107pub use std::pin::Pin;
108#[doc(no_inline)]
109pub use std::rc::Rc;
110#[doc(no_inline)]
111pub use std::str::FromStr;
112#[doc(no_inline)]
113pub use std::string::{String, ToString};
114#[doc(no_inline)]
115pub use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
116#[doc(no_inline)]
117pub use std::sync::{Arc, Weak};
118#[doc(no_inline)]
119pub use std::task;
120#[doc(no_inline)]
121pub use std::time::Duration;
122#[doc(no_inline)]
123pub use std::vec::Vec;
124
125#[doc(no_inline)]
126pub use async_lock::RwLock as AsyncRwLock;
127#[doc(no_inline)]
128pub use async_lock::RwLockReadGuard as AsyncRwLockReadGuard;
129#[doc(no_inline)]
130pub use async_lock::RwLockReadGuardArc as AsyncRwLockReadGuardArc;
131#[doc(no_inline)]
132pub use async_lock::RwLockWriteGuard as AsyncRwLockWriteGuard;
133#[doc(no_inline)]
134pub use async_lock::RwLockWriteGuardArc as AsyncRwLockWriteGuardArc;
135
136cfg_if! {
137    if #[cfg(all(target_arch = "wasm32", target_os = "unknown"))] {
138        #[doc(no_inline)]
139        pub use async_lock::Mutex as AsyncMutex;
140        #[doc(no_inline)]
141        pub use async_lock::MutexGuard as AsyncMutexGuard;
142        #[doc(no_inline)]
143        pub use async_lock::MutexGuardArc as AsyncMutexGuardArc;
144
145        #[doc(no_inline)]
146        pub use async_executors::JoinHandle as LowLevelJoinHandle;
147
148    } else {
149        cfg_if! {
150            if #[cfg(feature="rt-async-std")] {
151                #[doc(no_inline)]
152                pub use async_std::sync::Mutex as AsyncMutex;
153                #[doc(no_inline)]
154                pub use async_std::sync::MutexGuard as AsyncMutexGuard;
155                #[doc(no_inline)]
156                pub use async_std::sync::MutexGuardArc as AsyncMutexGuardArc;
157
158                #[doc(no_inline)]
159                pub use async_std::task::JoinHandle as LowLevelJoinHandle;
160
161            } else if #[cfg(feature="rt-tokio")] {
162                #[doc(no_inline)]
163                pub use tokio::sync::Mutex as AsyncMutex;
164                #[doc(no_inline)]
165                pub use tokio::sync::MutexGuard as AsyncMutexGuard;
166                #[doc(no_inline)]
167                pub use tokio::sync::OwnedMutexGuard as AsyncMutexGuardArc;
168
169                #[doc(no_inline)]
170                pub use tokio::task::JoinHandle as LowLevelJoinHandle;
171            } else {
172                compile_error!("needs executor implementation");
173            }
174        }
175    }
176}
177
178#[doc(inline)]
179pub use assembly_buffer::*;
180#[doc(inline)]
181pub use async_peek_stream::*;
182#[doc(inline)]
183pub use async_tag_lock::*;
184#[doc(inline)]
185pub use clone_stream::*;
186#[doc(inline)]
187pub use deferred_stream_processor::*;
188#[doc(inline)]
189pub use event_bus::*;
190#[doc(inline)]
191pub use eventual::*;
192#[doc(inline)]
193pub use eventual_base::{EventualCommon, EventualResolvedFuture};
194#[doc(inline)]
195pub use eventual_value::*;
196#[doc(inline)]
197pub use eventual_value_clone::*;
198#[doc(inline)]
199pub use future_queue::*;
200#[doc(inline)]
201pub use interval::*;
202#[doc(inline)]
203pub use ip_addr_port::*;
204#[doc(inline)]
205pub use ip_extra::*;
206#[doc(inline)]
207pub use ipc::*;
208#[doc(inline)]
209pub use must_join_handle::*;
210#[doc(inline)]
211pub use must_join_single_future::*;
212#[doc(inline)]
213pub use mutable_future::*;
214#[doc(inline)]
215pub use network_interfaces::*;
216#[doc(inline)]
217pub use network_result::*;
218#[doc(inline)]
219pub use random::*;
220#[doc(inline)]
221pub use single_shot_eventual::*;
222#[doc(inline)]
223pub use sleep::*;
224#[doc(inline)]
225#[cfg(not(all(target_arch = "wasm32", target_os = "unknown")))]
226pub use socket_tools::*;
227#[doc(inline)]
228pub use spawn::*;
229#[doc(inline)]
230pub use split_url::*;
231#[doc(inline)]
232pub use startup_lock::*;
233#[doc(inline)]
234pub use static_string_table::*;
235#[doc(inline)]
236pub use tick_task::*;
237#[doc(inline)]
238pub use timeout::*;
239#[doc(inline)]
240pub use timeout_or::*;
241#[doc(inline)]
242pub use timestamp::*;
243#[doc(inline)]
244pub use tools::*;
245#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
246pub use wasm::*;
247
248// Tests must be public for wasm-pack tests
249pub mod tests;
250
251cfg_if! {
252    if #[cfg(feature = "tracing")] {
253        use tracing::*;
254
255        #[macro_export]
256        macro_rules! debug_target_enabled {
257            ($target:expr) => { enabled!(target: $target, Level::DEBUG) }
258        }
259    } else {
260        use log::*;
261        #[macro_export]
262        macro_rules! debug_target_enabled {
263            ($target:expr) => { log_enabled!(target: $target, Level::Debug) }
264        }
265    }
266}
267use cfg_if::*;
268use futures_util::{AsyncRead, AsyncWrite};
269use parking_lot::*;
270use stop_token::*;
271use thiserror::Error as ThisError;
272
273pub use fn_name;
274
275// For iOS tests
276#[no_mangle]
277pub extern "C" fn main_rs() {}