1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
/// A `PropertyId` identifies a single attribute in the data structure of a
/// connection.
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[non_exhaustive]
pub enum PropertyId {
	ServerGroup(ServerGroupId),
	ChannelGroup(ChannelGroupId),
	OptionalChannelData(ChannelId),
	Channel(ChannelId),
	OptionalClientData(ClientId),
	ConnectionClientData(ClientId),
	Client(ClientId),
	OptionalServerData,
	ConnectionServerData,
	Server,
	Connection,

	ServerGroupId(ServerGroupId),
	ServerGroupName(ServerGroupId),
	ServerGroupGroupType(ServerGroupId),
	ServerGroupIcon(ServerGroupId),
	ServerGroupIsPermanent(ServerGroupId),
	ServerGroupSortId(ServerGroupId),
	ServerGroupNamingMode(ServerGroupId),
	ServerGroupNeededModifyPower(ServerGroupId),
	ServerGroupNeededMemberAddPower(ServerGroupId),
	ServerGroupNeededMemberRemovePower(ServerGroupId),
	ChannelGroupId(ChannelGroupId),
	ChannelGroupName(ChannelGroupId),
	ChannelGroupGroupType(ChannelGroupId),
	ChannelGroupIcon(ChannelGroupId),
	ChannelGroupIsPermanent(ChannelGroupId),
	ChannelGroupSortId(ChannelGroupId),
	ChannelGroupNamingMode(ChannelGroupId),
	ChannelGroupNeededModifyPower(ChannelGroupId),
	ChannelGroupNeededMemberAddPower(ChannelGroupId),
	ChannelGroupNeededMemberRemovePower(ChannelGroupId),
	ChannelId(ChannelId),
	ChannelGuid(ChannelId),
	ChannelParent(ChannelId),
	ChannelName(ChannelId),
	ChannelTopic(ChannelId),
	ChannelCodec(ChannelId),
	ChannelCodecQuality(ChannelId),
	ChannelMaxClients(ChannelId),
	ChannelMaxFamilyClients(ChannelId),
	ChannelOrder(ChannelId),
	ChannelChannelType(ChannelId),
	ChannelIsDefault(ChannelId),
	ChannelHasPassword(ChannelId),
	ChannelCodecLatencyFactor(ChannelId),
	ChannelIsUnencrypted(ChannelId),
	ChannelDeleteDelay(ChannelId),
	ChannelNeededTalkPower(ChannelId),
	ChannelForcedSilence(ChannelId),
	ChannelPhoneticName(ChannelId),
	ChannelIcon(ChannelId),
	ChannelIsPrivate(ChannelId),
	ChannelSubscribed(ChannelId),
	ChannelPermissionHints(ChannelId),
	ClientId(ClientId),
	ClientChannel(ClientId),
	ClientUid(ClientId),
	ClientName(ClientId),
	ClientInputMuted(ClientId),
	ClientOutputMuted(ClientId),
	ClientOutputOnlyMuted(ClientId),
	ClientInputHardwareEnabled(ClientId),
	ClientOutputHardwareEnabled(ClientId),
	ClientTalkPowerGranted(ClientId),
	ClientMetadata(ClientId),
	ClientIsRecording(ClientId),
	ClientDatabaseId(ClientId),
	ClientChannelGroup(ClientId),
	ClientServerGroup(ClientId, ServerGroupId),
	ClientAwayMessage(ClientId),
	ClientClientType(ClientId),
	ClientAvatarHash(ClientId),
	ClientTalkPower(ClientId),
	ClientTalkPowerRequest(ClientId),
	ClientDescription(ClientId),
	ClientIsPrioritySpeaker(ClientId),
	ClientUnreadMessages(ClientId),
	ClientPhoneticName(ClientId),
	ClientNeededServerqueryViewPower(ClientId),
	ClientIcon(ClientId),
	ClientIsChannelCommander(ClientId),
	ClientCountryCode(ClientId),
	ClientInheritedChannelGroupFromChannel(ClientId),
	ClientBadges(ClientId),
	ClientPermissionHints(ClientId),
	ServerPublicKey,
	ServerId,
	ServerName,
	ServerNickname,
	ServerWelcomeMessage,
	ServerPlatform,
	ServerVersion,
	ServerMaxClients,
	ServerCreated,
	ServerCodecEncryptionMode,
	ServerHostmessage,
	ServerHostmessageMode,
	ServerDefaultServerGroup,
	ServerDefaultChannelGroup,
	ServerHostbannerUrl,
	ServerHostbannerGfxUrl,
	ServerHostbannerGfxInterval,
	ServerPrioritySpeakerDimmModificator,
	ServerHostbuttonTooltip,
	ServerHostbuttonUrl,
	ServerHostbuttonGfxUrl,
	ServerPhoneticName,
	ServerIcon,
	ServerIp(IpAddr),
	ServerAskForPrivilegekey,
	ServerHostbannerMode,
	ServerTempChannelDefaultDeleteDelay,
	ServerProtocolVersion,
	ServerLicense,
	ConnectionOwnClient,
}

/// A `PropertyValue` contains the value of an attribute in the data structures.
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[non_exhaustive]
pub enum PropertyValue {
	ServerGroup(ServerGroup),
	ChannelGroup(ChannelGroup),
	OptionalChannelData(Option<OptionalChannelData>),
	Channel(Channel),
	OptionalClientData(Option<OptionalClientData>),
	ConnectionClientData(Option<ConnectionClientData>),
	Client(Client),
	OptionalServerData(Option<OptionalServerData>),
	ConnectionServerData(Option<ConnectionServerData>),
	Server(Server),
	Connection(Connection),

	ServerGroupId(ServerGroupId),
	String(String),
	GroupType(GroupType),
	IconId(IconId),
	Bool(bool),
	I32(i32),
	GroupNamingMode(GroupNamingMode),
	OptionI32(Option<i32>),
	ChannelGroupId(ChannelGroupId),
	ChannelId(ChannelId),
	OptionString(Option<String>),
	Codec(Codec),
	OptionU8(Option<u8>),
	OptionMaxClients(Option<MaxClients>),
	ChannelType(ChannelType),
	OptionBool(Option<bool>),
	OptionDuration(Option<Duration>),
	OptionIconId(Option<IconId>),
	OptionChannelPermissionHint(Option<ChannelPermissionHint>),
	ClientId(ClientId),
	OptionUidBuf(Option<UidBuf>),
	ClientDbId(ClientDbId),
	ClientType(ClientType),
	OptionTalkPowerRequest(Option<TalkPowerRequest>),
	U32(u32),
	OptionClientPermissionHint(Option<ClientPermissionHint>),
	EccKeyPubP256(EccKeyPubP256),
	U64(u64),
	U16(u16),
	OffsetDateTime(OffsetDateTime),
	CodecEncryptionMode(CodecEncryptionMode),
	HostMessageMode(HostMessageMode),
	Duration(Duration),
	F32(f32),
	IpAddr(IpAddr),
	HostBannerMode(HostBannerMode),
	LicenseType(LicenseType),
}

/// A `PropertyValueRef` contains a reference to the value of an attribute in
/// the data structures.
///
/// See [`PropertyValue`] for the owned variant.
#[derive(Clone, Debug, PartialEq)]
#[non_exhaustive]
pub enum PropertyValueRef<'a> {
	ServerGroup(&'a ServerGroup),
	ChannelGroup(&'a ChannelGroup),
	OptionalChannelData(Option<&'a OptionalChannelData>),
	Channel(&'a Channel),
	OptionalClientData(Option<&'a OptionalClientData>),
	ConnectionClientData(Option<&'a ConnectionClientData>),
	Client(&'a Client),
	OptionalServerData(Option<&'a OptionalServerData>),
	ConnectionServerData(Option<&'a ConnectionServerData>),
	Server(&'a Server),
	Connection(&'a Connection),

	ServerGroupId(ServerGroupId),
	String(&'a str),
	GroupType(GroupType),
	IconId(IconId),
	Bool(bool),
	I32(i32),
	GroupNamingMode(GroupNamingMode),
	OptionI32(Option<i32>),
	ChannelGroupId(ChannelGroupId),
	ChannelId(ChannelId),
	OptionString(Option<&'a str>),
	Codec(Codec),
	OptionU8(Option<u8>),
	OptionMaxClients(Option<MaxClients>),
	ChannelType(ChannelType),
	OptionBool(Option<bool>),
	OptionDuration(Option<Duration>),
	OptionIconId(Option<IconId>),
	OptionChannelPermissionHint(Option<ChannelPermissionHint>),
	ClientId(ClientId),
	OptionUidBuf(Option<&'a Uid>),
	ClientDbId(ClientDbId),
	ClientType(ClientType),
	OptionTalkPowerRequest(Option<&'a TalkPowerRequest>),
	U32(u32),
	OptionClientPermissionHint(Option<ClientPermissionHint>),
	EccKeyPubP256(&'a EccKeyPubP256),
	U64(u64),
	U16(u16),
	OffsetDateTime(OffsetDateTime),
	CodecEncryptionMode(CodecEncryptionMode),
	HostMessageMode(HostMessageMode),
	Duration(Duration),
	F32(f32),
	IpAddr(IpAddr),
	HostBannerMode(HostBannerMode),
	LicenseType(LicenseType),
}

impl PropertyValue {
	pub fn as_ref(&self) -> PropertyValueRef {
		match self {
			PropertyValue::ServerGroup(s) => PropertyValueRef::ServerGroup(&s),
			PropertyValue::ChannelGroup(s) => PropertyValueRef::ChannelGroup(&s),
			PropertyValue::OptionalChannelData(s) => PropertyValueRef::OptionalChannelData(s.as_ref()),
			PropertyValue::Channel(s) => PropertyValueRef::Channel(&s),
			PropertyValue::OptionalClientData(s) => PropertyValueRef::OptionalClientData(s.as_ref()),
			PropertyValue::ConnectionClientData(s) => PropertyValueRef::ConnectionClientData(s.as_ref()),
			PropertyValue::Client(s) => PropertyValueRef::Client(&s),
			PropertyValue::OptionalServerData(s) => PropertyValueRef::OptionalServerData(s.as_ref()),
			PropertyValue::ConnectionServerData(s) => PropertyValueRef::ConnectionServerData(s.as_ref()),
			PropertyValue::Server(s) => PropertyValueRef::Server(&s),
			PropertyValue::Connection(s) => PropertyValueRef::Connection(&s),

			PropertyValue::ServerGroupId(s) => PropertyValueRef::ServerGroupId(*s),
			PropertyValue::String(s) => PropertyValueRef::String(s.as_str()),
			PropertyValue::GroupType(s) => PropertyValueRef::GroupType(*s),
			PropertyValue::IconId(s) => PropertyValueRef::IconId(*s),
			PropertyValue::Bool(s) => PropertyValueRef::Bool(*s),
			PropertyValue::I32(s) => PropertyValueRef::I32(*s),
			PropertyValue::GroupNamingMode(s) => PropertyValueRef::GroupNamingMode(*s),
			PropertyValue::OptionI32(s) => PropertyValueRef::OptionI32(*s),
			PropertyValue::ChannelGroupId(s) => PropertyValueRef::ChannelGroupId(*s),
			PropertyValue::ChannelId(s) => PropertyValueRef::ChannelId(*s),
			PropertyValue::OptionString(s) => PropertyValueRef::OptionString(s.as_deref()),
			PropertyValue::Codec(s) => PropertyValueRef::Codec(*s),
			PropertyValue::OptionU8(s) => PropertyValueRef::OptionU8(*s),
			PropertyValue::OptionMaxClients(s) => PropertyValueRef::OptionMaxClients(*s),
			PropertyValue::ChannelType(s) => PropertyValueRef::ChannelType(*s),
			PropertyValue::OptionBool(s) => PropertyValueRef::OptionBool(*s),
			PropertyValue::OptionDuration(s) => PropertyValueRef::OptionDuration(*s),
			PropertyValue::OptionIconId(s) => PropertyValueRef::OptionIconId(*s),
			PropertyValue::OptionChannelPermissionHint(s) => PropertyValueRef::OptionChannelPermissionHint(*s),
			PropertyValue::ClientId(s) => PropertyValueRef::ClientId(*s),
			PropertyValue::OptionUidBuf(s) => PropertyValueRef::OptionUidBuf(s.as_ref().map(|s| s.as_ref())),
			PropertyValue::ClientDbId(s) => PropertyValueRef::ClientDbId(*s),
			PropertyValue::ClientType(s) => PropertyValueRef::ClientType(*s),
			PropertyValue::OptionTalkPowerRequest(s) => PropertyValueRef::OptionTalkPowerRequest(s.as_ref()),
			PropertyValue::U32(s) => PropertyValueRef::U32(*s),
			PropertyValue::OptionClientPermissionHint(s) => PropertyValueRef::OptionClientPermissionHint(*s),
			PropertyValue::EccKeyPubP256(s) => PropertyValueRef::EccKeyPubP256(s),
			PropertyValue::U64(s) => PropertyValueRef::U64(*s),
			PropertyValue::U16(s) => PropertyValueRef::U16(*s),
			PropertyValue::OffsetDateTime(s) => PropertyValueRef::OffsetDateTime(*s),
			PropertyValue::CodecEncryptionMode(s) => PropertyValueRef::CodecEncryptionMode(*s),
			PropertyValue::HostMessageMode(s) => PropertyValueRef::HostMessageMode(*s),
			PropertyValue::Duration(s) => PropertyValueRef::Duration(*s),
			PropertyValue::F32(s) => PropertyValueRef::F32(*s),
			PropertyValue::IpAddr(s) => PropertyValueRef::IpAddr(*s),
			PropertyValue::HostBannerMode(s) => PropertyValueRef::HostBannerMode(*s),
			PropertyValue::LicenseType(s) => PropertyValueRef::LicenseType(*s),
		}
	}
}