fixed errors

This commit is contained in:
Maple Nebel 2026-07-14 20:12:13 +02:00
commit c5bdf9f07f
3 changed files with 48 additions and 12 deletions

13
Cargo.lock generated
View file

@ -1578,6 +1578,15 @@ dependencies = [
"syn 1.0.109", "syn 1.0.109",
] ]
[[package]]
name = "matchers"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
dependencies = [
"regex-automata",
]
[[package]] [[package]]
name = "matchit" name = "matchit"
version = "0.8.4" version = "0.8.4"
@ -3740,10 +3749,14 @@ version = "0.3.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
dependencies = [ dependencies = [
"matchers",
"nu-ansi-term", "nu-ansi-term",
"once_cell",
"regex-automata",
"sharded-slab", "sharded-slab",
"smallvec", "smallvec",
"thread_local", "thread_local",
"tracing",
"tracing-core", "tracing-core",
"tracing-log", "tracing-log",
] ]

View file

@ -13,7 +13,7 @@ rnex-util = { path = "../rnex-util" }
sentry = { version = "0.48.4", features = ["tracing"] } sentry = { version = "0.48.4", features = ["tracing"] }
tokio = { version = "1.52.3", features = ["net"] } tokio = { version = "1.52.3", features = ["net"] }
tracing = "0.1.44" tracing = "0.1.44"
tracing-subscriber = "0.3.23" tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
[features] [features]
splatoon = ["v3-5-0"] splatoon = ["v3-5-0"]

View file

@ -22,6 +22,7 @@ pub use rnex_util as util;
pub use tokio; pub use tokio;
pub use tracing; pub use tracing;
use tracing::{Instrument, Level, error, instrument, span}; use tracing::{Instrument, Level, error, instrument, span};
use tracing_subscriber::Layer;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
#[derive(Debug, PartialEq, Eq, RmcSerialize)] #[derive(Debug, PartialEq, Eq, RmcSerialize)]
@ -32,7 +33,7 @@ pub struct ConnectionInitData {
} }
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct ModuleHolder { pub struct ModuleHolder {
modules: HashMap<TypeId, Arc<dyn Any>>, modules: HashMap<TypeId, Arc<dyn Any + Send + Sync>>,
} }
// invariant: the [`OnceLock`] inside of the Arc MUST be initialized, // invariant: the [`OnceLock`] inside of the Arc MUST be initialized,
@ -80,11 +81,11 @@ impl<T: Any> WeakPassthroughInitModule<T> {
} }
impl ModuleHolder { impl ModuleHolder {
pub fn get_ref<T: Any>(&self) -> Option<Arc<OnceLock<T>>> { pub fn get_ref<T: Any + Send + Sync>(&self) -> Option<Arc<OnceLock<T>>> {
let module = self.modules.get(&TypeId::of::<T>())?; let module = self.modules.get(&TypeId::of::<T>())?.clone();
let Some(module) = module.downcast_ref::<Arc<OnceLock<T>>>() else { let Ok(module) = module.downcast::<OnceLock<T>>() else {
let type_name = type_name::<T>(); let expected_type = type_name::<T>();
error!(type_name, "module type inconsistency"); error!(expected_type, "module type inconsistency");
return None; return None;
}; };
@ -96,10 +97,10 @@ impl ModuleHolder {
/// this object which invokes the deref() or as_ref() method until /// this object which invokes the deref() or as_ref() method until
/// AFTER the object has been initialized inside the module holder. /// AFTER the object has been initialized inside the module holder.
/// Doing so will result in a panic. /// Doing so will result in a panic.
pub fn get_ref_init_pt<T: Any>(&self) -> Option<PassthroughInitModule<T>> { pub fn get_ref_init_pt<T: Any + Send + Sync>(&self) -> Option<PassthroughInitModule<T>> {
self.get_ref::<T>().map(PassthroughInitModule) self.get_ref::<T>().map(PassthroughInitModule)
} }
pub fn create_empty_module_slot<T: Any>(&mut self) { pub fn create_empty_module_slot<T: Any + Send + Sync>(&mut self) {
self.modules self.modules
.insert(TypeId::of::<T>(), Arc::new(OnceLock::<T>::new())); .insert(TypeId::of::<T>(), Arc::new(OnceLock::<T>::new()));
} }
@ -113,7 +114,10 @@ impl ModuleHolder {
/// `Ok(_)` on success containing the wrapped value or /// `Ok(_)` on success containing the wrapped value or
/// `Err(_)` on failiure to set containing the value you passed in /// `Err(_)` on failiure to set containing the value you passed in
#[instrument] #[instrument]
pub fn init_slot<T: Any + Debug>(&self, val: T) -> Result<PassthroughInitModule<T>, T> { pub fn init_slot<T: Any + Send + Sync + Debug>(
&self,
val: T,
) -> Result<PassthroughInitModule<T>, T> {
let Some(slot) = self.get_ref() else { let Some(slot) = self.get_ref() else {
return Err(val); return Err(val);
}; };
@ -221,7 +225,7 @@ macro_rules! launch_rnex_module_server {
); );
$(#[$($tt)*])* $(#[$($tt)*])*
let $crate::paste::paste!{[<manager_ $module_type>]} = holder let $crate::paste::paste!{[<manager_ $module_type>]} = holder
.init_slot( .init_slot::<<$module_type as $crate::RnexModule>::Manager>(
<$module_type as $crate::RnexModule>::create_manager(&holder).await?, <$module_type as $crate::RnexModule>::create_manager(&holder).await?,
) )
.expect("initialized manager twice"); .expect("initialized manager twice");
@ -346,7 +350,13 @@ pub async fn with_setup(f: impl AsyncFnOnce() -> anyhow::Result<()>) {
None None
}; };
tracing_subscriber::registry() tracing_subscriber::registry()
.with(tracing_subscriber::fmt::layer()) .with(tracing_subscriber::fmt::layer().with_filter(
tracing_subscriber::filter::FilterFn::new(|m| {
!m.module_path().is_some_and(|m| {
(m.starts_with("h2") | m.starts_with("reqwest") | m.starts_with("hyper_util"))
}) || (*m.level() <= Level::INFO)
}),
))
.with(sentry::integrations::tracing::layer()) .with(sentry::integrations::tracing::layer())
.try_init() .try_init()
.expect("failed to init tracing subscriber"); .expect("failed to init tracing subscriber");
@ -464,3 +474,16 @@ pub static SERVER_PORT: LazyLock<u16> = LazyLock::new(|| {
.and_then(|s| s.parse().ok()) .and_then(|s| s.parse().ok())
.unwrap_or(10000) .unwrap_or(10000)
}); });
#[cfg(test)]
mod test {
use crate::ModuleHolder;
#[test]
fn test_type_consistenct() {
let mut man = ModuleHolder::default();
man.create_empty_module_slot::<i32>();
man.get_ref::<i32>();
}
}