Cow tools (again)

This commit is contained in:
Aode (lion) 2021-10-06 19:17:15 -05:00
parent cd7dd5fed7
commit d99576d929

View file

@ -51,7 +51,7 @@ pub trait PathItem<'a> {
where
Self: Sized + 'a;
fn to_bytes(&self) -> Vec<u8>;
fn to_bytes<'b>(&'b self) -> Cow<'b, [u8]>;
}
pub trait PathNode<'a>: PathItem<'a> {
@ -67,7 +67,7 @@ pub trait IntoOwned {
}
impl PathGen<'static> {
pub fn new_owned(root: String) -> Self {
pub const fn new_owned(root: String) -> Self {
PathGen {
root: Cow::Owned(root),
}
@ -123,11 +123,11 @@ impl<Inner, Segment> Node<Inner, Segment> {
(self.inner, self.segment)
}
pub fn parent(&self) -> &Inner {
pub const fn parent(&self) -> &Inner {
&self.inner
}
pub fn segment(&self) -> &Segment {
pub const fn segment(&self) -> &Segment {
&self.segment
}
@ -157,11 +157,11 @@ impl<Inner, Segment> Field<Inner, Segment> {
(self.inner, self.segment)
}
pub fn parent(&self) -> &Inner {
pub const fn parent(&self) -> &Inner {
&self.inner
}
pub fn segment(&self) -> &Segment {
pub const fn segment(&self) -> &Segment {
&self.segment
}
}
@ -171,7 +171,7 @@ impl<Inner, Segment> Prefix<Inner, Segment> {
self.inner
}
pub fn parent(&self) -> &Inner {
pub const fn parent(&self) -> &Inner {
&self.inner
}
}
@ -436,9 +436,9 @@ where
fn construct(&self) -> Vec<u8> {
let mut vec = self.inner.construct();
vec.extend_from_slice(b".");
vec.extend_from_slice(&escape(N::NAME));
vec.extend_from_slice(&escape(N::NAME.into()));
vec.extend_from_slice(b".");
vec.extend_from_slice(&escape(&self.segment.to_bytes()));
vec.extend_from_slice(&escape(self.segment.to_bytes()));
vec
}
}
@ -451,7 +451,7 @@ where
fn construct(&self) -> Vec<u8> {
let mut vec = self.inner.construct();
vec.extend_from_slice(b".");
vec.extend_from_slice(&escape(&self.segment.to_bytes()));
vec.extend_from_slice(&escape(self.segment.to_bytes()));
vec
}
}
@ -464,7 +464,7 @@ where
fn construct(&self) -> Vec<u8> {
let mut vec = self.inner.construct();
vec.extend_from_slice(b".");
vec.extend_from_slice(&escape(N::NAME));
vec.extend_from_slice(&escape(N::NAME.into()));
vec
}
}
@ -560,17 +560,17 @@ fn rsplit_once_escaped<'a>(s: &'a [u8]) -> Option<(&'a [u8], &'a [u8])> {
None
}
fn escape(s: &[u8]) -> Cow<'_, [u8]> {
if find_any(s, ESCAPE_CHARS).is_some() {
fn escape<'a>(s: Cow<'a, [u8]>) -> Cow<'a, [u8]> {
if find_any(&s, ESCAPE_CHARS).is_some() {
let v = join(
split(s, b".").map(|part| join(split(part, b"\\"), b"\\\\")),
split(&s, b".").map(|part| join(split(part, b"\\"), b"\\\\")),
b"\\.",
);
return Cow::Owned(v);
}
Cow::Borrowed(s)
s
}
fn unescape(s: &[u8]) -> Cow<'_, [u8]> {
@ -615,9 +615,9 @@ pub mod test {
T2: PathItem<'b, Error = E> + Debug + PartialEq<T> + 'b,
E: Debug,
{
let vec = item.to_bytes();
let vec = item.to_bytes().to_vec();
let round_trip = T2::parse(Cow::Owned(vec.clone())).unwrap();
let plus_one = round_trip.to_bytes();
let plus_one = round_trip.to_bytes().to_vec();
assert_eq!(round_trip, item);
assert_eq!(vec, plus_one);
@ -728,7 +728,7 @@ mod tests {
];
for (start, escaped) in inputs {
assert_eq!(escape(start).as_ref(), escaped);
assert_eq!(escape(start.into()).as_ref(), escaped);
assert_eq!(unescape(escaped).as_ref(), start);
}
}
@ -844,8 +844,8 @@ mod tests {
Ok(Deck(cow))
}
fn to_bytes(&self) -> Vec<u8> {
self.0.as_bytes().to_vec()
fn to_bytes<'b>(&'b self) -> Cow<'b, [u8]> {
Cow::Borrowed(self.0.as_bytes())
}
}
@ -859,8 +859,8 @@ mod tests {
Ok(Key(String::from_utf8_lossy(&bytes).parse()?))
}
fn to_bytes(&self) -> Vec<u8> {
self.0.to_string().into_bytes()
fn to_bytes<'b>(&'b self) -> Cow<'b, [u8]> {
Cow::Owned(self.0.to_string().into_bytes())
}
}
@ -878,8 +878,8 @@ mod tests {
Err(CommandFieldError)
}
fn to_bytes(&self) -> Vec<u8> {
b"command".to_vec()
fn to_bytes<'b>(&'b self) -> Cow<'b, [u8]> {
Cow::Borrowed(b"command")
}
}