Cow tools (again)
This commit is contained in:
parent
cd7dd5fed7
commit
d99576d929
48
src/lib.rs
48
src/lib.rs
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue