use bevy_ecs::prelude::*;
use windows::Win32::Foundation::HWND;
use super::zorder_pair::{ExpectedOrder, InsertSpec, PeerLoss, SkipReason};
const UNKNOWN: &str = "-";
const OWNER_ESTABLISHED_TAG: &str = "[zorder-pair] owner-established";
const FIX_TAG: &str = "[zorder-pair] fix";
const SKIP_TAG: &str = "[zorder-pair] skip";
const VERIFY_FAILED_TAG: &str = "[zorder-pair] verify-failed";
const OWNER_ESTABLISH_FAILED_TAG: &str = "[zorder-pair] owner-establish-failed";
const SINK_OBSERVED_TAG: &str = "[zorder-pair] sink-observed";
pub(crate) fn hwnd_field(hwnd: Option<HWND>) -> String {
match hwnd {
Some(h) => format!("0x{:X}", h.0 as usize),
None => UNKNOWN.to_string(),
}
}
fn tristate_field(value: Option<bool>) -> String {
match value {
Some(v) => v.to_string(),
None => UNKNOWN.to_string(),
}
}
impl SkipReason {
pub(crate) fn as_str(&self) -> &'static str {
match self {
SkipReason::AlreadyAdjacent => "AlreadyAdjacent",
SkipReason::PeerMissing => "PeerMissing",
SkipReason::HandleMissing => "HandleMissing",
SkipReason::EchoOrIrrelevant => "EchoOrIrrelevant",
SkipReason::StrategyDisabled => "StrategyDisabled",
}
}
}
impl InsertSpec {
fn as_field(&self) -> String {
match self {
InsertSpec::After(hwnd) => hwnd_field(Some(*hwnd)),
InsertSpec::TopEdge => "top-edge".to_string(),
InsertSpec::TopOfNormalBand => "top-of-normal-band".to_string(),
}
}
}
impl PeerLoss {
fn as_str(&self) -> &'static str {
match self {
PeerLoss::Despawned => "despawned",
PeerLoss::HandleRemoved => "handle-removed",
}
}
}
pub(crate) fn owner_established_line(
entity: Entity,
peer: Entity,
owned_hwnd: HWND,
owner_hwnd: HWND,
measured_prev: Option<HWND>,
) -> String {
format!(
"{OWNER_ESTABLISHED_TAG} entity={entity:?} peer={peer:?} owned_hwnd={owned} \
owner_hwnd={owner} measured_prev={measured}",
owned = hwnd_field(Some(owned_hwnd)),
owner = hwnd_field(Some(owner_hwnd)),
measured = hwnd_field(measured_prev),
)
}
pub(crate) fn fix_line(
entity: Entity,
peer: Entity,
insert_after: InsertSpec,
measured_next_after_fix: Option<HWND>,
) -> String {
format!(
"{FIX_TAG} entity={entity:?} peer={peer:?} insert_after={insert_after} \
measured_next_after_fix={measured}",
insert_after = insert_after.as_field(),
measured = hwnd_field(measured_next_after_fix),
)
}
pub(crate) fn skip_line(entity: Entity, peer: Entity, reason: SkipReason) -> String {
format!(
"{SKIP_TAG} entity={entity:?} peer={peer:?} reason={reason}",
reason = reason.as_str(),
)
}
pub(crate) fn verify_failed_line(
entity: Entity,
peer: Entity,
expected: ExpectedOrder,
measured: Option<HWND>,
) -> String {
format!(
"{VERIFY_FAILED_TAG} entity={entity:?} peer={peer:?} expected_above={above} \
expected_below={below} measured={measured}",
above = hwnd_field(Some(expected.above)),
below = hwnd_field(Some(expected.below)),
measured = hwnd_field(measured),
)
}
pub(crate) fn owner_detached_line(
entity: Entity,
peer: Entity,
owned_hwnd: HWND,
owner_hwnd: HWND,
loss: PeerLoss,
) -> String {
format!(
"ペアの相手が消えたため owner を切り離しました entity={entity:?} peer={peer:?} \
owned_hwnd={owned} owner_hwnd={owner} peer_state={state}",
owned = hwnd_field(Some(owned_hwnd)),
owner = hwnd_field(Some(owner_hwnd)),
state = loss.as_str(),
)
}
pub(crate) fn owner_detach_failed_line(
entity: Entity,
peer: Entity,
owned_hwnd: HWND,
owner_hwnd: HWND,
error: &windows::core::Error,
) -> String {
format!(
"ペアの相手が消えましたが owner の切離しに失敗しました(処理は継続します) \
entity={entity:?} peer={peer:?} owned_hwnd={owned} owner_hwnd={owner} \
error={code:?} message={message}",
owned = hwnd_field(Some(owned_hwnd)),
owner = hwnd_field(Some(owner_hwnd)),
code = error.code(),
message = error.message(),
)
}
pub(crate) fn owner_establish_failed_line(entity: Entity, error: &windows::core::Error) -> String {
format!(
"{OWNER_ESTABLISH_FAILED_TAG} entity={entity:?} error={code:?} message={message}",
code = error.code(),
message = error.message(),
)
}
pub(crate) fn sink_observed_line(
entity: Entity,
adjacency_ok: bool,
foreground: Option<HWND>,
behind_foreground: Option<bool>,
) -> String {
format!(
"{SINK_OBSERVED_TAG} entity={entity:?} adjacency_ok={adjacency_ok} \
foreground={foreground} behind_foreground={behind}",
foreground = hwnd_field(foreground),
behind = tristate_field(behind_foreground),
)
}