utils.ha 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. use fmt;
  2. use errors;
  3. use os;
  4. use fs;
  5. use a::logger;
  6. export def MKDIR_MODE: fs::mode = 0
  7. | fs::mode::USER_RWX
  8. | fs::mode::GROUP_RX
  9. | fs::mode::OTHER_RX
  10. | 0;
  11. export fn get_archive(action: Action) str =
  12. match (action) {
  13. case let l: ActionList => return l.archive;
  14. case let x: ActionExtract => return x.archive;
  15. case let c: ActionCreate => return c.archive;
  16. case let a: ActionListArchives => abort("ActionListArchives does not have archive field");
  17. };
  18. export fn fatal(cfg: *const Config, fmt: str, args: fmt::field...) never = {
  19. match (cfg.logger) {
  20. case let l: logger::Logger => logger::error(l, fmt, args...);
  21. case => void;
  22. };
  23. os::exit(os::status::FAILURE);
  24. };
  25. export fn create_out_dir(cfg: *const Config) void = {
  26. let access: bool =
  27. match (os::access(cfg.out_dir, os::amode::F_OK)) {
  28. case let a: bool => yield a;
  29. case let e: fs::error =>
  30. yield match (e) {
  31. case errors::noentry => yield false;
  32. case =>
  33. fatal(cfg, "failed to check access for '{}': {}", cfg.out_dir, fs::strerror(e));
  34. };
  35. };
  36. if (!access)
  37. match (os::mkdirs(cfg.out_dir, MKDIR_MODE)) {
  38. case let e: fs::error =>
  39. fatal(cfg, "failed to create directory '{}': {}", cfg.out_dir, fs::strerror(e));
  40. case void => void;
  41. };
  42. };