expanded_pathbuf/
lib.rs

1#![doc = include_str!("../README.md")]
2
3use derive_more::*;
4use std::{path::PathBuf, str::FromStr};
5
6#[derive(AsRef, Clone, Debug, Deref, DerefMut, From)]
7#[as_ref(forward)]
8#[from(forward)]
9pub struct ExpandedPathBuf(pub PathBuf);
10
11impl FromStr for ExpandedPathBuf {
12    type Err = anyhow::Error;
13
14    fn from_str(s: &str) -> Result<Self, Self::Err> {
15        Ok(Self(PathBuf::from_str(&shellexpand::full(s)?)?))
16    }
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22
23    #[test]
24    fn expand() {
25        let path = "~/hello";
26
27        assert_eq!(
28            ExpandedPathBuf::from_str(path).unwrap().0,
29            directories::BaseDirs::new()
30                .unwrap()
31                .home_dir()
32                .join("hello")
33        );
34    }
35}