1use crate::Target;
25use crate::error::{ClientError, Result};
26use crate::message::element::{GroupMember, Group, FriendMember};
27
28#[derive(Debug, Clone)]
29pub enum MessageChannel {
30 Friend(Target),
31 Group(Target),
32 Temp { qq: Target, group: Target },
33}
34
35impl MessageChannel {
36 pub fn group(self) -> Result<Target> {
37 if let MessageChannel::Group(group) = self {
38 Ok(group)
39 } else {
40 Err(ClientError("Expect Group Target".to_string()))
41 }
42 }
43
44 pub fn friend(self) -> Result<Target> {
45 if let MessageChannel::Friend(friend) = self {
46 Ok(friend)
47 } else {
48 Err(ClientError("Expect Friend Target".to_string()))
49 }
50 }
51
52 pub fn temp(self) -> Result<(Target, Target)> {
54 if let MessageChannel::Temp { qq, group } = self {
55 Ok((qq, group))
56 } else {
57 Err(ClientError("Expect Temp Target".to_string()))
58 }
59 }
60}
61
62pub trait AsGroupChannel {
63 fn as_group_channel(&self) -> MessageChannel;
64}
65
66pub trait AsFriendChannel {
67 fn as_friend_channel(&self) -> MessageChannel;
68}
69
70pub trait AsTempChannel {
71 fn as_temp_channel(&self) -> MessageChannel;
72}
73
74impl AsGroupChannel for Target {
75 fn as_group_channel(&self) -> MessageChannel {
76 MessageChannel::Group(self.clone())
77 }
78}
79
80impl AsFriendChannel for Target {
81 fn as_friend_channel(&self) -> MessageChannel {
82 MessageChannel::Friend(self.clone())
83 }
84}
85
86impl AsTempChannel for (Target, Target) {
87 fn as_temp_channel(&self) -> MessageChannel {
88 MessageChannel::Temp { qq: self.0, group: self.1 }
89 }
90}
91
92impl AsFriendChannel for GroupMember {
93 fn as_friend_channel(&self) -> MessageChannel {
94 self.id.as_friend_channel()
95 }
96}
97
98impl AsTempChannel for GroupMember {
99 fn as_temp_channel(&self) -> MessageChannel {
100 (self.id, self.group.id).as_temp_channel()
101 }
102}
103
104impl AsGroupChannel for Group {
105 fn as_group_channel(&self) -> MessageChannel {
106 self.id.as_group_channel()
107 }
108}
109
110impl AsFriendChannel for FriendMember {
111 fn as_friend_channel(&self) -> MessageChannel {
112 self.id.as_friend_channel()
113 }
114}