1use tan::{
2 context::Context,
3 error::Error,
4 expr::Expr,
5 util::{
6 fs::{get_dirname, get_full_extension},
7 module_util::require_module,
8 },
9};
10
11pub fn path_get_dirname(args: &[Expr]) -> Result<Expr, Error> {
23 let [path] = args else {
24 return Err(Error::invalid_arguments("requires a `path` argument", None));
25 };
26
27 let Some(path) = path.as_string() else {
31 return Err(Error::invalid_arguments(
32 "`path` argument should be a String",
33 path.range(),
34 ));
35 };
36
37 let dirname = get_dirname(path).unwrap_or("");
39
40 Ok(Expr::string(dirname))
43}
44
45pub fn path_get_extension(args: &[Expr]) -> Result<Expr, Error> {
47 let [path] = args else {
48 return Err(Error::invalid_arguments("requires a `path` argument", None));
49 };
50
51 let Some(path) = path.as_string() else {
55 return Err(Error::invalid_arguments(
56 "`path` argument should be a String",
57 path.range(),
58 ));
59 };
60
61 let extension = get_full_extension(path).unwrap_or("".to_string());
63
64 Ok(Expr::string(extension))
67}
68
69pub fn import_lib_path(context: &mut Context) {
70 let module = require_module("path", context);
73
74 module.insert_invocable("get-dirname", Expr::foreign_func(&path_get_dirname));
76
77 module.insert_invocable("get-extension", Expr::foreign_func(&path_get_extension));
79}