1use alloc::string::String;
2
3use umsh_core::{ChannelId, ChannelKey};
4use umsh_crypto::{
5 CryptoEngine,
6 software::{SoftwareAes, SoftwareSha256},
7};
8
9#[derive(Clone)]
14pub struct Channel {
15 key: ChannelKey,
16 channel_id: ChannelId,
17 name: String,
18}
19
20impl core::fmt::Debug for Channel {
21 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
22 f.debug_struct("Channel")
23 .field("channel_id", &self.channel_id)
24 .field("name", &self.name)
25 .finish()
26 }
27}
28
29impl Channel {
30 pub fn named(name: &str) -> Self {
34 let crypto = CryptoEngine::new(SoftwareAes, SoftwareSha256);
35 let key = crypto.derive_named_channel_key(name);
36 let channel_id = crypto.derive_channel_id(&key);
37
38 Self {
39 key,
40 channel_id,
41 name: String::from(name),
42 }
43 }
44
45 pub fn private(key: ChannelKey, name: &str) -> Self {
49 let crypto = CryptoEngine::new(SoftwareAes, SoftwareSha256);
50 let channel_id = crypto.derive_channel_id(&key);
51
52 Self {
53 key,
54 channel_id,
55 name: String::from(name),
56 }
57 }
58
59 pub fn name(&self) -> &str {
61 &self.name
62 }
63
64 pub fn channel_id(&self) -> &ChannelId {
66 &self.channel_id
67 }
68
69 pub fn key(&self) -> &ChannelKey {
71 &self.key
72 }
73}
74
75impl PartialEq for Channel {
76 fn eq(&self, other: &Self) -> bool {
77 self.key.0 == other.key.0
78 }
79}
80
81impl Eq for Channel {}