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}