I'm adapting my file system abstraction layer to:
- Absolutize path. That is, something like
"/foo/../bar.bin"
turns into"/bar.bin"
- Absolutize path under a certain directory. For example,
"/appdata/../.."
turns into"/appdata"
(cannot go out of"/appdata"
).
I found the path-absolutize might work for this purpose. When constructing a File
object, either some_std_path.absolutize()
or some_std_path.absolutize_virtually()
is used:
impl File {
/// Constructs a new `File` object.
pub fn new<T: AsRef<str>>(url_or_path: T) -> Self {
let url_or_path = url_or_path.as_ref();
if url_or_path.starts_with("file:") {
File { m_scheme: FileScheme::File, m_path: String::from(Path::new(&url_or_path[5..]).absolutize().unwrap().to_str().unwrap_or("")) }
} else if url_or_path.starts_with("app:") {
let p = Path::new(&url_or_path[4..])
.absolutize_virtually::<&str>(
unsafe { APPLICATION_DIRECTORY }.unwrap().as_ref())
.unwrap().to_str().unwrap_or(unsafe {APPLICATION_DIRECTORY}.unwrap().as_ref());
File { m_scheme: FileScheme::App, m_path: String::from(p) }
} else if url_or_path.starts_with("app-storage:") {
let p = Path::new(&url_or_path[12..])
.absolutize_virtually::<&str>(
unsafe { APPLICATION_STORAGE_DIRECTORY }.unwrap().as_ref())
.unwrap().to_str().unwrap_or(unsafe {APPLICATION_STORAGE_DIRECTORY}.unwrap().as_ref());
File { m_scheme: FileScheme::AppStorage, m_path: String::from(p) }
} else {
File { m_scheme: FileScheme::File, m_path: String::from(Path::new(url_or_path).absolutize().unwrap().to_str().unwrap_or("")) }
}
}
// ...
}
I'm getting this:
app: scheme
temporary value dropped while borrowed
consider using a `let` binding to create a longer lived valuerustcE0716
lib.rs(50, 95): temporary value is freed at the end of this statement
lib.rs(51, 68): borrow later used here
app-storage: scheme
temporary value dropped while borrowed
consider using a `let` binding to create a longer lived valuerustcE0716
lib.rs(56, 103): temporary value is freed at the end of this statement
lib.rs(57, 75): borrow later used here