naia_shared/world/delegation/
entity_auth_status.rs1use naia_serde::SerdeInternal;
2
3use crate::HostType;
4
5#[derive(SerdeInternal, Clone, Copy, Debug, PartialEq, Eq, Hash)]
6pub enum EntityAuthStatus {
7 Available,
9 Requested,
11 Granted,
13 Releasing,
15 Denied,
17}
18
19impl EntityAuthStatus {
20 pub fn is_available(&self) -> bool {
21 matches!(self, EntityAuthStatus::Available)
22 }
23
24 pub fn is_requested(&self) -> bool {
25 matches!(self, EntityAuthStatus::Requested)
26 }
27
28 pub fn is_granted(&self) -> bool {
29 matches!(self, EntityAuthStatus::Granted)
30 }
31
32 pub fn is_denied(&self) -> bool {
33 matches!(self, EntityAuthStatus::Denied)
34 }
35
36 pub fn is_releasing(&self) -> bool {
37 matches!(self, EntityAuthStatus::Releasing)
38 }
39}
40
41#[derive(Debug)]
42pub struct HostEntityAuthStatus {
43 host_type: HostType,
44 auth_status: EntityAuthStatus,
45}
46
47impl HostEntityAuthStatus {
48 pub fn new(host_type: HostType, auth_status: EntityAuthStatus) -> Self {
49 Self {
50 host_type,
51 auth_status,
52 }
53 }
54
55 pub fn can_request(&self) -> bool {
56 match (self.host_type, self.auth_status) {
57 (HostType::Client, EntityAuthStatus::Available) => true,
58 (HostType::Client, EntityAuthStatus::Requested) => false,
59 (HostType::Client, EntityAuthStatus::Granted) => false,
60 (HostType::Client, EntityAuthStatus::Releasing) => false,
61 (HostType::Client, EntityAuthStatus::Denied) => false,
62 (HostType::Server, EntityAuthStatus::Available) => todo!(),
63 (HostType::Server, EntityAuthStatus::Requested) => todo!(),
64 (HostType::Server, EntityAuthStatus::Granted) => todo!(),
65 (HostType::Server, EntityAuthStatus::Releasing) => todo!(),
66 (HostType::Server, EntityAuthStatus::Denied) => todo!(),
67 }
68 }
69
70 pub fn can_release(&self) -> bool {
71 match (self.host_type, self.auth_status) {
72 (HostType::Client, EntityAuthStatus::Available) => false,
73 (HostType::Client, EntityAuthStatus::Requested) => true,
74 (HostType::Client, EntityAuthStatus::Granted) => true,
75 (HostType::Client, EntityAuthStatus::Releasing) => false,
76 (HostType::Client, EntityAuthStatus::Denied) => false,
77 (HostType::Server, EntityAuthStatus::Available) => todo!(),
78 (HostType::Server, EntityAuthStatus::Requested) => todo!(),
79 (HostType::Server, EntityAuthStatus::Granted) => todo!(),
80 (HostType::Server, EntityAuthStatus::Releasing) => todo!(),
81 (HostType::Server, EntityAuthStatus::Denied) => todo!(),
82 }
83 }
84
85 pub fn can_mutate(&self) -> bool {
86 match (self.host_type, self.auth_status) {
87 (HostType::Client, EntityAuthStatus::Available) => false,
88 (HostType::Client, EntityAuthStatus::Requested) => true,
89 (HostType::Client, EntityAuthStatus::Granted) => true,
90 (HostType::Client, EntityAuthStatus::Releasing) => false,
91 (HostType::Client, EntityAuthStatus::Denied) => false,
92 (HostType::Server, EntityAuthStatus::Available) => true,
93 (HostType::Server, EntityAuthStatus::Requested) => true,
94 (HostType::Server, EntityAuthStatus::Granted) => true,
95 (HostType::Server, EntityAuthStatus::Releasing) => true,
96 (HostType::Server, EntityAuthStatus::Denied) => true,
97 }
98 }
99
100 pub fn can_read(&self) -> bool {
101 match (self.host_type, self.auth_status) {
102 (HostType::Client, EntityAuthStatus::Available) => true,
103 (HostType::Client, EntityAuthStatus::Requested) => false,
104 (HostType::Client, EntityAuthStatus::Granted) => false,
105 (HostType::Client, EntityAuthStatus::Releasing) => true,
106 (HostType::Client, EntityAuthStatus::Denied) => true,
107 (HostType::Server, EntityAuthStatus::Available) => true,
108 (HostType::Server, EntityAuthStatus::Requested) => true,
109 (HostType::Server, EntityAuthStatus::Granted) => true,
110 (HostType::Server, EntityAuthStatus::Releasing) => true,
111 (HostType::Server, EntityAuthStatus::Denied) => true,
112 }
113 }
114
115 pub fn can_write(&self) -> bool {
116 match (self.host_type, self.auth_status) {
117 (HostType::Client, EntityAuthStatus::Available) => false,
118 (HostType::Client, EntityAuthStatus::Requested) => false,
119 (HostType::Client, EntityAuthStatus::Granted) => true,
120 (HostType::Client, EntityAuthStatus::Releasing) => true,
121 (HostType::Client, EntityAuthStatus::Denied) => false,
122 (HostType::Server, EntityAuthStatus::Available) => true,
123 (HostType::Server, EntityAuthStatus::Requested) => true,
124 (HostType::Server, EntityAuthStatus::Granted) => true,
125 (HostType::Server, EntityAuthStatus::Releasing) => true,
126 (HostType::Server, EntityAuthStatus::Denied) => true,
127 }
128 }
129
130 pub fn status(&self) -> EntityAuthStatus {
131 self.auth_status
132 }
133}