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