diff --git a/flee/src/lib.rs b/flee/src/lib.rs index a615d4b..de2759c 100644 --- a/flee/src/lib.rs +++ b/flee/src/lib.rs @@ -65,20 +65,20 @@ fn split<'a, 'b>(s: &'a [u8], items: &'b [u8]) -> Split<'a, 'b> { Split(Some(s), items) } -fn do_escape(s: &[u8], escaped_codes: &[u8], escape_token: u8) -> Vec { +fn do_escape<'a>(s: &'a [u8], escaped_codes: &[u8], escape_token: u8) -> Cow<'a, [u8]> { match escaped_codes { - [] => s.to_vec(), - [first, rest @ ..] => join( + [] => Cow::Borrowed(s), + [first, rest @ ..] => Cow::Owned(join( split(s, &[*first]).map(|part| do_escape(part, rest, escape_token)), &[escape_token, *first], - ), + )), } } pub fn escape<'a>(s: &'a [u8], delimiter: u8, escape_token: u8) -> Cow<'a, [u8]> { let escaped_codes = &[escape_token, delimiter]; if find_any(&s, escaped_codes).is_some() { - return Cow::Owned(do_escape(s, escaped_codes, escape_token)); + return do_escape(s, escaped_codes, escape_token); } Cow::Borrowed(s)