Skip to content

Commit 099bc1e

Browse files
committed
♻️ refactor: convert Name struct to enum and extract to own module
- Convert Name from struct to enum with Named(String) and Unnamed variants - Extract Name type into dedicated name.rs module for better organization - Add From<String> and From<&str> implementations for convenient construction - Update all usage sites to use Name::from() constructor - Update field access from .0 to .as_str() method - Maintain backward compatibility through re-exports and Deref trait - Improve type safety by preventing empty named statements
1 parent 37278e7 commit 099bc1e

File tree

9 files changed

+76
-50
lines changed

9 files changed

+76
-50
lines changed

packages/cipherstash-proxy/src/postgresql/context/mod.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ pub mod column;
22

33
use super::{
44
format_code::FormatCode,
5-
messages::{
6-
describe::{Describe, Target},
7-
Name,
8-
},
5+
messages::{describe::Describe, Name, Target},
96
Column,
107
};
118
use crate::{
@@ -621,7 +618,7 @@ mod tests {
621618

622619
let mut context = Context::new(1, schema);
623620

624-
let name = Name("name".to_string());
621+
let name = Name::from("name");
625622

626623
context.add_statement(name.clone(), statement());
627624

@@ -646,8 +643,8 @@ mod tests {
646643

647644
let mut context = Context::new(1, schema);
648645

649-
let statement_name = Name("statement".to_string());
650-
let portal_name = Name("portal".to_string());
646+
let statement_name = Name::from("statement");
647+
let portal_name = Name::from("portal");
651648

652649
// Add statement to context
653650
context.add_statement(statement_name.clone(), statement());
@@ -688,8 +685,8 @@ mod tests {
688685
let mut context = Context::new(1, schema);
689686

690687
// Create multiple statements
691-
let statement_name_1 = Name("statement_1".to_string());
692-
let statement_name_2 = Name("statement_2".to_string());
688+
let statement_name_1 = Name::from("statement_1");
689+
let statement_name_2 = Name::from("statement_2");
693690

694691
// Add statements to context
695692
context.add_statement(statement_name_1.clone(), statement());
@@ -698,7 +695,7 @@ mod tests {
698695
// Replicate pipelined execution
699696
// Add multiple portals with the same name
700697
// Pointing to different statements
701-
let portal_name = Name("portal".to_string());
698+
let portal_name = Name::from("portal");
702699

703700
let statement_1 = context.get_statement(&statement_name_1).unwrap();
704701
context.add_portal(portal_name.clone(), portal(&statement_1));
@@ -737,14 +734,14 @@ mod tests {
737734

738735
let mut context = Context::new(1, schema);
739736

740-
let statement_name_1 = Name("statement_1".to_string());
737+
let statement_name_1 = Name::from("statement_1");
741738
let portal_name_1 = Name::unnamed();
742739

743-
let statement_name_2 = Name("statement_2".to_string());
740+
let statement_name_2 = Name::from("statement_2");
744741
let portal_name_2 = Name::unnamed();
745742

746-
let statement_name_3 = Name("statement_3".to_string());
747-
let portal_name_3 = Name("portal_3".to_string());
743+
let statement_name_3 = Name::from("statement_3");
744+
let portal_name_3 = Name::from("portal_3");
748745

749746
// Add statement to context
750747
context.add_statement(statement_name_1.clone(), statement());

packages/cipherstash-proxy/src/postgresql/frontend.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ where
333333
Target::Portal => self.context.close_portal(&close.name),
334334
Target::Statement => {
335335
self.context.close_portal(&close.name);
336-
self.context.close_statement(&close.name);
336+
// self.context.close_statement(&close.name);
337337
}
338338
}
339339
Ok(())

packages/cipherstash-proxy/src/postgresql/messages/bind.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,10 @@ impl TryFrom<&BytesMut> for Bind {
227227
let _len = cursor.get_i32();
228228

229229
let portal = cursor.read_string()?;
230-
let portal = Name(portal);
230+
let portal = Name::from(portal);
231231

232232
let prepared_statement = cursor.read_string()?;
233-
let prepared_statement = Name(prepared_statement);
233+
let prepared_statement = Name::from(prepared_statement);
234234

235235
let num_param_format_codes = cursor.get_i16();
236236
let mut param_format_codes = Vec::new();

packages/cipherstash-proxy/src/postgresql/messages/close.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ impl TryFrom<&BytesMut> for Close {
5252
let target = cursor.get_u8();
5353
let target = Target::try_from(target)?;
5454
let name = cursor.read_string()?;
55-
let name = Name(name);
55+
let name = Name::from(name);
5656

5757
Ok(Close { target, name })
5858
}
@@ -64,7 +64,7 @@ impl TryFrom<Close> for BytesMut {
6464
fn try_from(close: Close) -> Result<BytesMut, Error> {
6565
let mut bytes = BytesMut::new();
6666

67-
let name = CString::new(close.name.0.as_str())?;
67+
let name = CString::new(close.name.as_str())?;
6868
let name = name.as_bytes_with_nul();
6969

7070
let len = SIZE_I32 + SIZE_U8 + name.len();
@@ -122,7 +122,7 @@ mod tests {
122122
let close = Close::try_from(&bytes).unwrap();
123123

124124
assert!(matches!(close.target, Target::Statement));
125-
assert_eq!(close.name.0, "stmt1");
125+
assert_eq!(close.name.as_str(), "stmt1");
126126
assert!(!close.name.is_unnamed());
127127
}
128128

@@ -132,13 +132,13 @@ mod tests {
132132

133133
let close = Close {
134134
target: Target::Portal,
135-
name: Name("portal1".to_string()),
135+
name: Name::from("portal1"),
136136
};
137137

138138
let bytes = BytesMut::try_from(close).unwrap();
139139
let parsed = Close::try_from(&bytes).unwrap();
140140

141141
assert!(matches!(parsed.target, Target::Portal));
142-
assert_eq!(parsed.name.0, "portal1");
142+
assert_eq!(parsed.name.as_str(), "portal1");
143143
}
144144
}

packages/cipherstash-proxy/src/postgresql/messages/describe.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ pub(crate) struct Describe {
3333
pub name: Name,
3434
}
3535

36-
3736
impl TryFrom<&BytesMut> for Describe {
3837
type Error = Error;
3938

@@ -53,7 +52,7 @@ impl TryFrom<&BytesMut> for Describe {
5352
let target = cursor.get_u8();
5453
let target = Target::try_from(target)?;
5554
let name = cursor.read_string()?;
56-
let name = Name(name);
55+
let name = Name::from(name);
5756

5857
Ok(Describe { target, name })
5958
}
@@ -65,7 +64,7 @@ impl TryFrom<Describe> for BytesMut {
6564
fn try_from(describe: Describe) -> Result<BytesMut, Error> {
6665
let mut bytes = BytesMut::new();
6766

68-
let name = CString::new(describe.name.0.as_str())?;
67+
let name = CString::new(describe.name.as_str())?;
6968
let name = name.as_bytes_with_nul();
7069

7170
let len = SIZE_I32 + SIZE_U8 + name.len();
@@ -78,4 +77,3 @@ impl TryFrom<Describe> for BytesMut {
7877
Ok(bytes)
7978
}
8079
}
81-

packages/cipherstash-proxy/src/postgresql/messages/execute.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ impl TryFrom<&BytesMut> for Execute {
2929
let _len = cursor.get_i32(); // read and progress cursor
3030

3131
let portal = cursor.read_string()?;
32-
let portal = Name(portal);
32+
let portal = Name::from(portal);
3333
let max_rows = cursor.get_i32();
3434

3535
Ok(Execute { portal, max_rows })

packages/cipherstash-proxy/src/postgresql/messages/mod.rs

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ pub mod data_row;
99
pub mod describe;
1010
pub mod error_response;
1111
pub mod execute;
12+
pub mod name;
1213
pub mod param_description;
1314
pub mod parse;
1415
pub mod query;
@@ -18,6 +19,7 @@ pub mod target;
1819
pub mod terminate;
1920

2021
// Re-export commonly used types
22+
pub use name::Name;
2123
pub use target::Target;
2224

2325
pub const NULL: i32 = -1;
@@ -264,27 +266,6 @@ impl fmt::Display for FrontendCode {
264266
}
265267
}
266268

267-
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
268-
pub struct Name(pub String);
269-
270-
impl Name {
271-
pub fn unnamed() -> Name {
272-
Name("".to_string())
273-
}
274-
275-
pub fn is_unnamed(&self) -> bool {
276-
self.0.is_empty()
277-
}
278-
}
279-
280-
impl std::ops::Deref for Name {
281-
type Target = str;
282-
283-
fn deref(&self) -> &str {
284-
self.0.as_str()
285-
}
286-
}
287-
288269
///
289270
/// Peaks at the first byte char.
290271
/// Assumes that a leading `{` may be a JSON value
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
2+
pub enum Name {
3+
Named(String),
4+
Unnamed,
5+
}
6+
7+
impl Name {
8+
pub fn unnamed() -> Name {
9+
Name::Unnamed
10+
}
11+
12+
pub fn is_unnamed(&self) -> bool {
13+
matches!(self, Name::Unnamed)
14+
}
15+
16+
pub fn as_str(&self) -> &str {
17+
match self {
18+
Name::Named(s) => s,
19+
Name::Unnamed => "",
20+
}
21+
}
22+
}
23+
24+
impl std::ops::Deref for Name {
25+
type Target = str;
26+
27+
fn deref(&self) -> &str {
28+
self.as_str()
29+
}
30+
}
31+
32+
impl From<String> for Name {
33+
fn from(s: String) -> Self {
34+
if s.is_empty() {
35+
Name::Unnamed
36+
} else {
37+
Name::Named(s)
38+
}
39+
}
40+
}
41+
42+
impl From<&str> for Name {
43+
fn from(s: &str) -> Self {
44+
if s.is_empty() {
45+
Name::Unnamed
46+
} else {
47+
Name::Named(s.to_string())
48+
}
49+
}
50+
}

packages/cipherstash-proxy/src/postgresql/messages/parse.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ impl TryFrom<&BytesMut> for Parse {
6262

6363
let _len = cursor.get_i32();
6464
let name = cursor.read_string()?;
65-
let name = Name(name);
65+
let name = Name::from(name);
6666

6767
let statement = cursor.read_string()?;
6868
let num_params = cursor.get_i16();
@@ -89,7 +89,7 @@ impl TryFrom<Parse> for BytesMut {
8989
fn try_from(parse: Parse) -> Result<BytesMut, Error> {
9090
let mut bytes = BytesMut::new();
9191

92-
let name = CString::new(parse.name.0.as_str())?;
92+
let name = CString::new(parse.name.as_str())?;
9393
let name = name.as_bytes_with_nul();
9494

9595
let statement = CString::new(parse.statement)?;

0 commit comments

Comments
 (0)