blob: 6811f4ff2ebea778d03144d330a363f61a8f6441 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
use bstr::{BStr, ByteSlice};
///
pub mod name {
/// The error used in [name()](super::name()).
#[derive(Debug, thiserror::Error)]
#[allow(missing_docs)]
pub enum Error {
#[error("Submodule names cannot be empty")]
Empty,
#[error("Submodules names must not contains '..'")]
ParentComponent,
}
}
/// Return the original `name` if it is valid, or the respective error indicating what was wrong with it.
pub fn name(name: &BStr) -> Result<&BStr, name::Error> {
if name.is_empty() {
return Err(name::Error::Empty);
}
match name.find(b"..") {
Some(pos) => {
let &b = name.get(pos + 2).ok_or(name::Error::ParentComponent)?;
if b == b'/' || b == b'\\' {
Err(name::Error::ParentComponent)
} else {
Ok(name)
}
}
None => Ok(name),
}
}
|