weiss_core/
visibility_policy.rs

1use crate::config::{CurriculumConfig, ObservationVisibility};
2use crate::events::Zone;
3use crate::state::TargetZone;
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq)]
6pub enum ZoneIdentityVisibility {
7    Public,
8    OwnerOnly,
9}
10
11pub fn zone_identity_visibility(
12    zone: Zone,
13    curriculum: &CurriculumConfig,
14) -> ZoneIdentityVisibility {
15    match zone {
16        Zone::Deck | Zone::Hand | Zone::Stock => ZoneIdentityVisibility::OwnerOnly,
17        Zone::Memory => {
18            if curriculum.memory_is_public {
19                ZoneIdentityVisibility::Public
20            } else {
21                ZoneIdentityVisibility::OwnerOnly
22            }
23        }
24        _ => ZoneIdentityVisibility::Public,
25    }
26}
27
28pub fn target_zone_identity_visibility(
29    zone: TargetZone,
30    curriculum: &CurriculumConfig,
31) -> ZoneIdentityVisibility {
32    match zone {
33        TargetZone::Hand | TargetZone::DeckTop | TargetZone::Stock => {
34            ZoneIdentityVisibility::OwnerOnly
35        }
36        TargetZone::Memory => {
37            if curriculum.memory_is_public {
38                ZoneIdentityVisibility::Public
39            } else {
40                ZoneIdentityVisibility::OwnerOnly
41            }
42        }
43        _ => ZoneIdentityVisibility::Public,
44    }
45}
46
47pub fn hide_zone_for_viewer(
48    visibility: ObservationVisibility,
49    viewer: Option<u8>,
50    owner: u8,
51    zone: Zone,
52    curriculum: &CurriculumConfig,
53) -> bool {
54    if visibility != ObservationVisibility::Public {
55        return false;
56    }
57    match zone_identity_visibility(zone, curriculum) {
58        ZoneIdentityVisibility::Public => false,
59        ZoneIdentityVisibility::OwnerOnly => viewer.map(|v| v != owner).unwrap_or(true),
60    }
61}
62
63pub fn hide_target_zone_for_viewer(
64    visibility: ObservationVisibility,
65    viewer: Option<u8>,
66    owner: u8,
67    zone: TargetZone,
68    curriculum: &CurriculumConfig,
69) -> bool {
70    if visibility != ObservationVisibility::Public {
71        return false;
72    }
73    match target_zone_identity_visibility(zone, curriculum) {
74        ZoneIdentityVisibility::Public => false,
75        ZoneIdentityVisibility::OwnerOnly => viewer.map(|v| v != owner).unwrap_or(true),
76    }
77}