1use std::{
2 collections::BTreeSet,
3 fmt::{Display, Formatter},
4 ops::{Deref, DerefMut},
5 str::FromStr,
6};
7
8use serde::{Deserialize, Serialize};
9use tokio::net::UnixStream;
10use tokio_serde::{Framed as SerdeFramed, formats::Bincode};
11use tokio_util::codec::{Framed, LengthDelimitedCodec};
12
13use crate::core::{database_privileges::DatabasePrivilegesDiff, protocol::*};
14
15pub type ServerToClientMessageStream = SerdeFramed<
16 Framed<UnixStream, LengthDelimitedCodec>,
17 Request,
18 Response,
19 Bincode<Request, Response>,
20>;
21
22pub type ClientToServerMessageStream = SerdeFramed<
23 Framed<UnixStream, LengthDelimitedCodec>,
24 Response,
25 Request,
26 Bincode<Response, Request>,
27>;
28
29pub fn create_server_to_client_message_stream(socket: UnixStream) -> ServerToClientMessageStream {
30 let length_delimited = Framed::new(socket, LengthDelimitedCodec::new());
31 tokio_serde::Framed::new(length_delimited, Bincode::default())
32}
33
34pub fn create_client_to_server_message_stream(socket: UnixStream) -> ClientToServerMessageStream {
35 let length_delimited = Framed::new(socket, LengthDelimitedCodec::new());
36 tokio_serde::Framed::new(length_delimited, Bincode::default())
37}
38
39#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, Default)]
40pub struct MySQLUser(String);
41
42impl FromStr for MySQLUser {
43 type Err = String;
44
45 fn from_str(s: &str) -> Result<Self, Self::Err> {
46 Ok(MySQLUser(s.to_string()))
47 }
48}
49
50impl Deref for MySQLUser {
51 type Target = String;
52
53 fn deref(&self) -> &Self::Target {
54 &self.0
55 }
56}
57
58impl DerefMut for MySQLUser {
59 fn deref_mut(&mut self) -> &mut Self::Target {
60 &mut self.0
61 }
62}
63
64impl Display for MySQLUser {
65 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
66 write!(f, "{}", self.0)
67 }
68}
69
70impl From<&str> for MySQLUser {
71 fn from(s: &str) -> Self {
72 MySQLUser(s.to_string())
73 }
74}
75
76impl From<String> for MySQLUser {
77 fn from(s: String) -> Self {
78 MySQLUser(s)
79 }
80}
81
82#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, Default)]
83pub struct MySQLDatabase(String);
84
85impl FromStr for MySQLDatabase {
86 type Err = String;
87
88 fn from_str(s: &str) -> Result<Self, Self::Err> {
89 Ok(MySQLDatabase(s.to_string()))
90 }
91}
92
93impl Deref for MySQLDatabase {
94 type Target = String;
95
96 fn deref(&self) -> &Self::Target {
97 &self.0
98 }
99}
100
101impl DerefMut for MySQLDatabase {
102 fn deref_mut(&mut self) -> &mut Self::Target {
103 &mut self.0
104 }
105}
106
107impl Display for MySQLDatabase {
108 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
109 write!(f, "{}", self.0)
110 }
111}
112
113impl From<&str> for MySQLDatabase {
114 fn from(s: &str) -> Self {
115 MySQLDatabase(s.to_string())
116 }
117}
118
119impl From<String> for MySQLDatabase {
120 fn from(s: String) -> Self {
121 MySQLDatabase(s)
122 }
123}
124
125#[non_exhaustive]
126#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
127pub enum Request {
128 CreateDatabases(Vec<MySQLDatabase>),
129 DropDatabases(Vec<MySQLDatabase>),
130 ListDatabases(Option<Vec<MySQLDatabase>>),
131 ListPrivileges(Option<Vec<MySQLDatabase>>),
132 ModifyPrivileges(BTreeSet<DatabasePrivilegesDiff>),
133
134 CreateUsers(Vec<MySQLUser>),
135 DropUsers(Vec<MySQLUser>),
136 PasswdUser(MySQLUser, String),
137 ListUsers(Option<Vec<MySQLUser>>),
138 LockUsers(Vec<MySQLUser>),
139 UnlockUsers(Vec<MySQLUser>),
140
141 Exit,
143}
144
145#[non_exhaustive]
148#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
149pub enum Response {
150 CreateDatabases(CreateDatabasesOutput),
152 DropDatabases(DropDatabasesOutput),
153 ListDatabases(ListDatabasesOutput),
154 ListAllDatabases(ListAllDatabasesOutput),
155 ListPrivileges(GetDatabasesPrivilegeData),
156 ListAllPrivileges(GetAllDatabasesPrivilegeData),
157 ModifyPrivileges(ModifyDatabasePrivilegesOutput),
158
159 CreateUsers(CreateUsersOutput),
160 DropUsers(DropUsersOutput),
161 PasswdUser(SetPasswordOutput),
162 ListUsers(ListUsersOutput),
163 ListAllUsers(ListAllUsersOutput),
164 LockUsers(LockUsersOutput),
165 UnlockUsers(UnlockUsersOutput),
166
167 Ready,
169 Error(String),
170}