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
use std::borrow::Cow;
use std::time;
use crate::id::Id;
use crate::line::Line;
use crate::word::Word;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Command<'a> {
Version(Cow<'a, Word>),
Register {
username: Cow<'a, Word>,
password: Cow<'a, Line>,
},
Login {
username: Cow<'a, Word>,
password: Cow<'a, Line>,
},
ChangePassword(Cow<'a, Line>),
Logout,
ListRooms,
ListMembers {
roomname: Cow<'a, Word>,
},
CreateRoom,
LeaveRoom(Cow<'a, Word>),
Invite {
roomname: Cow<'a, Word>,
username: Cow<'a, Word>,
},
Send {
roomname: Cow<'a, Word>,
reply_on: Option<Id>,
message: Cow<'a, Line>,
},
SendAt {
apikey: Cow<'a, Word>,
roomname: Cow<'a, Word>,
reply_on: Option<Id>,
timestamp: time::SystemTime,
message: Cow<'a, Line>,
},
History {
roomname: Cow<'a, Word>,
count: i64,
},
HistoryBefore {
roomname: Cow<'a, Word>,
count: i64,
message_id: Id,
},
GetMessage(Id),
Ping,
IsOnline {
username: Cow<'a, Word>,
},
FirebaseToken(Cow<'a, Word>),
DeleteFirebaseToken(Cow<'a, Word>),
UserActive(i64),
}
impl<'a> Command<'a> {
#[allow(clippy::inherent_to_string)]
pub(super) fn to_string(&self) -> String {
match self {
Command::Version(v) => format!("version {}", v),
Command::Register { username, password } => {
format!("register {} {}", username, password)
}
Command::Login { username, password } => format!("login {} {}", username, password),
Command::ChangePassword(password) => format!("change_password {}", password),
Command::Logout => String::from("logout"),
Command::ListRooms => String::from("list_rooms"),
Command::ListMembers { roomname } => format!("list_members {}", roomname),
Command::CreateRoom => String::from("create_room"),
Command::LeaveRoom(roomname) => format!("leave_room {}", roomname),
Command::Invite { roomname, username } => format!("invite {} {}", roomname, username),
Command::Send {
roomname,
reply_on,
message,
} => {
let reply_on: i64 = match reply_on {
None => -1,
Some(id) => id.into(),
};
format!("send {} {} {}", roomname, reply_on, message)
}
Command::SendAt {
apikey,
roomname,
reply_on,
timestamp,
message,
} => {
let reply_on: i64 = match reply_on {
None => -1,
Some(id) => id.into(),
};
format!(
"sendat {} {} {} {} {}",
apikey,
roomname,
reply_on,
timestamp
.duration_since(time::UNIX_EPOCH)
.unwrap()
.as_micros(),
message
)
}
Command::History { roomname, count } => format!("history {} {}", roomname, count),
Command::HistoryBefore {
roomname,
count,
message_id,
} => format!("history_before {} {} {}", roomname, count, message_id),
Command::GetMessage(message_id) => format!("get_message {}", message_id),
Command::Ping => String::from("ping"),
Command::IsOnline { username } => format!("is_online {}", username),
Command::FirebaseToken(token) => format!("firebase_token {}", token),
Command::DeleteFirebaseToken(token) => format!("delete_firebase_token {}", token),
Command::UserActive(active) => format!("user_active {}", active),
}
}
}