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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use crate::*;
use err_tools::*;
use std::path::{Path, PathBuf};
use tparam::*;
fn path_dat<'a>(p: &Path) -> TData {
TData::String(p.display().to_string())
}
fn join_args<'a>(args: &[TCow<'a>]) -> PathBuf {
let mut path = PathBuf::new();
for v in args {
path.push(v.to_string());
}
path
}
pub fn parent<'a>(args: &[TCow<'a>]) -> anyhow::Result<TCow<'a>> {
if let Some(p) = join_args(args).parent() {
b_ok(TData::String(p.display().to_string()))
} else {
b_ok(TData::String("".to_string()))
}
}
pub fn join<'a>(args: &[TCow<'a>]) -> anyhow::Result<TCow<'a>> {
b_ok(path_dat(&join_args(args)))
}
pub fn bread_crumbs<'a>(args: &[TCow<'a>]) -> anyhow::Result<TCow<'a>> {
let mut path = join_args(args);
let mut res = Vec::new();
res.push(path_dat(&path));
while let Some(par) = path.parent() {
res.insert(0, path_dat(&par));
path = PathBuf::from(par);
}
b_ok(TData::List(res))
}
pub fn base_name<'a>(args: &[TCow<'a>]) -> anyhow::Result<TCow<'a>> {
join_args(args)
.file_name()
.and_then(|v| v.to_str())
.map(|v| TCow::Owned(TData::String(v.to_string())))
.e_str("Could not get file base_name")
}
pub fn base_name_sure<'a>(args: &[TCow<'a>]) -> anyhow::Result<TCow<'a>> {
b_ok(TData::String(
join_args(args)
.file_name()
.and_then(|v| v.to_str())
.unwrap_or("")
.to_string(),
))
}
pub fn with_ext<'a>(args: &[TCow<'a>]) -> anyhow::Result<TCow<'a>> {
if args.len() < 2 {
return e_str("'with_ext' requires a filenae then an extension");
}
let p = PathBuf::from(args[0].to_string());
let pe = p.with_extension(args[1].to_string());
b_ok(path_dat(&pe))
}
pub fn stem<'a>(args: &[TCow<'a>]) -> anyhow::Result<TCow<'a>> {
join_args(args)
.file_stem()
.map(|s| TCow::Owned(TData::String(s.to_string_lossy().to_string())))
.e_str("No File to stem")
}
pub fn full_stem<'a>(args: &[TCow<'a>]) -> anyhow::Result<TCow<'a>> {
let j = join_args(args);
let stem = j.file_stem().e_str("No file to stem")?;
b_ok(TData::String(j.with_file_name(stem).display().to_string()))
}