refactor: use a single closure for filtering in emit_to (#12907)

* Use a single closure for filtering

* clippy

* Update crates/tauri/src/manager/mod.rs

---------

Co-authored-by: Lucas Fernandes Nogueira <lucas@tauri.app>
This commit is contained in:
Tony
2025-03-16 00:46:51 +08:00
committed by GitHub
parent 013f8f6523
commit 51bcafe323
2 changed files with 34 additions and 43 deletions

View File

@@ -1001,7 +1001,7 @@ pub trait Emitter<R: Runtime>: sealed::ManagerBase<R> {
{
let event = EventName::new(event)?;
let payload = EmitPayload::Serialize(&payload);
self.manager().emit_to(target, event, payload)
self.manager().emit_to(target.into(), event, payload)
}
/// Similar to [`Emitter::emit_to`] but the payload is json serialized.
@@ -1011,7 +1011,7 @@ pub trait Emitter<R: Runtime>: sealed::ManagerBase<R> {
{
let event = EventName::new(event)?;
let payload = EmitPayload::<()>::Str(payload);
self.manager().emit_to(target, event, payload)
self.manager().emit_to(target.into(), event, payload)
}
/// Emits an event to all [targets](EventTarget) based on the given filter.

View File

@@ -596,60 +596,51 @@ impl<R: Runtime> AppManager<R> {
feature = "tracing",
tracing::instrument("app::emit::to", skip(self, target, payload), fields(target))
)]
pub(crate) fn emit_to<I, S>(
pub(crate) fn emit_to<S>(
&self,
target: I,
target: EventTarget,
event: EventName<&str>,
payload: EmitPayload<'_, S>,
) -> crate::Result<()>
where
I: Into<EventTarget>,
S: Serialize,
{
let target = target.into();
#[cfg(feature = "tracing")]
tracing::Span::current().record("target", format!("{target:?}"));
fn filter_target(target: &EventTarget, candidate: &EventTarget) -> bool {
match target {
// if targeting any label, filter matching labels
EventTarget::AnyLabel { label } => match candidate {
EventTarget::Window { label: l }
| EventTarget::Webview { label: l }
| EventTarget::WebviewWindow { label: l }
| EventTarget::AnyLabel { label: l } => l == label,
_ => false,
},
EventTarget::Window { label } => match candidate {
EventTarget::AnyLabel { label: l } | EventTarget::Window { label: l } => l == label,
_ => false,
},
EventTarget::Webview { label } => match candidate {
EventTarget::AnyLabel { label: l } | EventTarget::Webview { label: l } => l == label,
_ => false,
},
EventTarget::WebviewWindow { label } => match candidate {
EventTarget::AnyLabel { label: l } | EventTarget::WebviewWindow { label: l } => {
l == label
}
_ => false,
},
// otherwise match same target
_ => target == candidate,
}
}
match target {
// if targeting all, emit to all using emit without filter
EventTarget::Any => self.emit(event, payload),
// if targeting any label, emit using emit_filter and filter labels
EventTarget::AnyLabel {
label: target_label,
} => self.emit_filter(event, payload, |t| match t {
EventTarget::Window { label }
| EventTarget::Webview { label }
| EventTarget::WebviewWindow { label }
| EventTarget::AnyLabel { label } => label == &target_label,
_ => false,
}),
EventTarget::Window {
label: target_label,
} => self.emit_filter(event, payload, |t| match t {
EventTarget::AnyLabel { label } | EventTarget::Window { label } => label == &target_label,
_ => false,
}),
EventTarget::Webview {
label: target_label,
} => self.emit_filter(event, payload, |t| match t {
EventTarget::AnyLabel { label } | EventTarget::Webview { label } => label == &target_label,
_ => false,
}),
EventTarget::WebviewWindow {
label: target_label,
} => self.emit_filter(event, payload, |t| match t {
EventTarget::AnyLabel { label } | EventTarget::WebviewWindow { label } => {
label == &target_label
}
_ => false,
}),
// otherwise match same target
_ => self.emit_filter(event, payload, |t| t == &target),
target => self.emit_filter(event, payload, |t| filter_target(&target, t)),
}
}