mirror of
https://github.com/tauri-apps/tauri.git
synced 2026-01-31 00:35:19 +01:00
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:
@@ -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.
|
||||
|
||||
@@ -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)),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user