naia_shared/world/delegation/
auth_channel.rs

1use std::sync::{Arc, RwLock};
2
3use crate::{
4    world::delegation::entity_auth_status::{EntityAuthStatus, HostEntityAuthStatus},
5    HostType,
6};
7
8// EntityAuthChannel
9#[derive(Clone)]
10pub(crate) struct EntityAuthChannel {
11    data: Arc<RwLock<EntityAuthData>>,
12}
13
14impl EntityAuthChannel {
15    pub(crate) fn new_channel(host_type: HostType) -> (EntityAuthMutator, EntityAuthAccessor) {
16        let channel = Self {
17            data: Arc::new(RwLock::new(EntityAuthData::new(host_type))),
18        };
19
20        let sender = EntityAuthMutator::new(&channel);
21        let receiver = EntityAuthAccessor::new(&channel);
22
23        (sender, receiver)
24    }
25
26    fn auth_status(&self) -> HostEntityAuthStatus {
27        let data = self
28            .data
29            .as_ref()
30            .read()
31            .expect("Lock on AuthStatus is held by current thread.");
32        return data.auth_status();
33    }
34
35    fn set_auth_status(&self, auth_status: EntityAuthStatus) {
36        let mut data = self
37            .data
38            .as_ref()
39            .write()
40            .expect("Lock on AuthStatus is held by current thread.");
41        data.set_auth_status(auth_status);
42    }
43}
44
45// EntityAuthData
46struct EntityAuthData {
47    host_type: HostType,
48    status: EntityAuthStatus,
49}
50
51impl EntityAuthData {
52    fn new(host_type: HostType) -> Self {
53        let status = match host_type {
54            HostType::Server => EntityAuthStatus::Available,
55            HostType::Client => EntityAuthStatus::Requested,
56        };
57        Self { host_type, status }
58    }
59
60    fn auth_status(&self) -> HostEntityAuthStatus {
61        HostEntityAuthStatus::new(self.host_type, self.status)
62    }
63
64    fn set_auth_status(&mut self, auth_status: EntityAuthStatus) {
65        self.status = auth_status;
66    }
67}
68
69// EntityAuthAccessor
70#[derive(Clone)]
71pub struct EntityAuthAccessor {
72    channel: EntityAuthChannel,
73}
74
75impl EntityAuthAccessor {
76    fn new(channel: &EntityAuthChannel) -> Self {
77        Self {
78            channel: channel.clone(),
79        }
80    }
81
82    pub(crate) fn auth_status(&self) -> HostEntityAuthStatus {
83        self.channel.auth_status()
84    }
85}
86
87// EntityAuthMutator
88// no Clone necessary
89pub(crate) struct EntityAuthMutator {
90    channel: EntityAuthChannel,
91}
92
93impl EntityAuthMutator {
94    fn new(channel: &EntityAuthChannel) -> Self {
95        Self {
96            channel: channel.clone(),
97        }
98    }
99
100    pub(crate) fn set_auth_status(&self, auth_status: EntityAuthStatus) {
101        self.channel.set_auth_status(auth_status);
102    }
103}