mysqladm/core/protocol/
request_response.rs

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    // Commit,
142    Exit,
143}
144
145// TODO: include a generic "message" that will display a message to the user?
146
147#[non_exhaustive]
148#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
149pub enum Response {
150    // Specific data for specific commands
151    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    // Generic responses
168    Ready,
169    Error(String),
170}