Skip to content

Commit 59f2ca6

Browse files
committed
Remove some unnecessary string cloning
1 parent 7fa88f0 commit 59f2ca6

3 files changed

Lines changed: 19 additions & 34 deletions

File tree

src/cpon.rs

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -505,17 +505,14 @@ impl<'a, R> CponReader<'a, R>
505505
fn read_datetime(&mut self) -> Result<Value, ReadError> {
506506
self.get_byte()?; // eat 'd'
507507
let v = self.read_string()?;
508-
if let Value::String(sdata) = v {
509-
match DateTime::from_iso_str(&sdata) {
510-
Ok(dt) => {
511-
return Ok(Value::from(dt));
512-
}
513-
Err(err) => {
514-
return Err(self.make_error(&err, ReadErrorReason::InvalidCharacter))
515-
}
508+
match DateTime::from_iso_str(&v) {
509+
Ok(dt) => {
510+
Ok(Value::from(dt))
511+
}
512+
Err(err) => {
513+
Err(self.make_error(&err, ReadErrorReason::InvalidCharacter))
516514
}
517515
}
518-
Err(self.make_error("Invalid DateTime", ReadErrorReason::InvalidCharacter))
519516
}
520517
fn read_true(&mut self) -> Result<Value, ReadError> {
521518
self.read_text_token("true")?;
@@ -545,7 +542,7 @@ where R: Read
545542
fn make_error(&self, msg: &str, reason: ReadErrorReason) -> ReadError {
546543
self.byte_reader.make_error(&format!("Cpon read error - {msg}"), reason)
547544
}
548-
fn read_string(&mut self) -> Result<Value, ReadError> {
545+
fn read_string(&mut self) -> Result<String, ReadError> {
549546
let mut buff: Vec<u8> = Vec::new();
550547
self.get_byte()?; // eat "
551548
loop {
@@ -572,9 +569,9 @@ where R: Read
572569
}
573570
}
574571
}
575-
let s = std::str::from_utf8(&buff);
572+
let s = String::from_utf8(buff);
576573
match s {
577-
Ok(s) => Ok(Value::from(s)),
574+
Ok(s) => Ok(s),
578575
Err(e) => Err(self.make_error(&format!("Invalid String, Utf8 error: {e}"), ReadErrorReason::InvalidCharacter)),
579576
}
580577
}
@@ -615,7 +612,7 @@ impl<R> Reader for CponReader<'_, R>
615612
let b = self.peek_byte()?;
616613
let v = match &b {
617614
b'0' ..= b'9' | b'+' | b'-' => self.read_number(),
618-
b'"' => self.read_string(),
615+
b'"' => self.read_string().map(Value::from),
619616
b'b' => self.read_blob_esc(),
620617
b'x' => self.read_blob_hex(),
621618
b'[' => self.read_list(),
@@ -681,11 +678,7 @@ impl<R> Reader for CponReader<'_, R>
681678
if b == b'"' {
682679
// Regular map keys are strings
683680
let key = self.read_string()?;
684-
if let Value::String(s) = key {
685-
Ok(MapKey::String((*s).clone()))
686-
} else {
687-
Err(self.make_error("Expected string key in map", ReadErrorReason::InvalidCharacter))
688-
}
681+
Ok(MapKey::String(key))
689682
} else if b.is_ascii_digit() || b == b'+' || b == b'-' {
690683
// IMap keys are integers
691684
let ReadInt{ value, is_negative, .. } = self.read_int(0, false)?;

src/json.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ where R: Read
318318
fn make_error(&self, msg: &str, reason: ReadErrorReason) -> ReadError {
319319
self.byte_reader.make_error(&format!("Cpon read error - {msg}"), reason)
320320
}
321-
fn read_string(&mut self) -> Result<Value, ReadError> {
321+
fn read_string(&mut self) -> Result<String, ReadError> {
322322
let mut buff: Vec<u8> = Vec::new();
323323
self.get_byte()?; // eat "
324324
loop {
@@ -365,9 +365,9 @@ where R: Read
365365
}
366366
}
367367
}
368-
let s = std::str::from_utf8(&buff);
368+
let s = String::from_utf8(buff);
369369
match s {
370-
Ok(s) => Ok(Value::from(s)),
370+
Ok(s) => Ok(s),
371371
Err(e) => Err(self.make_error(&format!("Invalid String, Utf8 error: {e}"), ReadErrorReason::InvalidCharacter)),
372372
}
373373
}
@@ -421,7 +421,7 @@ impl<R> Reader for JsonReader<'_, R>
421421
let b = self.peek_byte()?;
422422
let v = match &b {
423423
b'0' ..= b'9' | b'+' | b'-' => self.read_number(),
424-
b'"' => self.read_string(),
424+
b'"' => self.read_string().map(Value::from),
425425
b'[' => self.read_list(),
426426
b'{' => self.read_map(),
427427
b't' => self.read_true(),

src/textrdwr.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub trait TextReader : Reader {
3737
}
3838
fn get_byte(&mut self) -> Result<u8, ReadError>;
3939
fn make_error(&self, msg: &str, reason: ReadErrorReason) -> ReadError;
40-
fn read_string(&mut self) -> Result<Value, ReadError>;
40+
fn read_string(&mut self) -> Result<String, ReadError>;
4141

4242
fn skip_white_or_insignificant(&mut self) -> Result<(), ReadError> {
4343
loop {
@@ -313,20 +313,12 @@ pub trait TextReader : Reader {
313313
break;
314314
}
315315
let key = self.read_string();
316-
let skey = match &key {
317-
Ok(b) => {
318-
match b {
319-
Value::String(s) => {
320-
s
321-
},
322-
_ => return Err(self.make_error("Read MetaMap key internal error", ReadErrorReason::InvalidCharacter)),
323-
}
324-
},
325-
_ => return Err(self.make_error(&format!("Invalid Map key '{b}'"), ReadErrorReason::InvalidCharacter)),
316+
let Ok(skey) = key else {
317+
return Err(self.make_error(&format!("Invalid Map key '{b}'"), ReadErrorReason::InvalidCharacter));
326318
};
327319
self.skip_white_or_insignificant()?;
328320
let val = self.read()?;
329-
map.insert(skey.to_string(), val);
321+
map.insert(skey, val);
330322
}
331323
Ok(Value::from(map))
332324
}

0 commit comments

Comments
 (0)