diff --git a/src/archive.cpp b/src/archive.cpp index d73ae51..2d0efbe 100644 --- a/src/archive.cpp +++ b/src/archive.cpp @@ -1,5 +1,6 @@ #include #include + namespace logger = spdlog; #include @@ -126,6 +127,22 @@ ArchiveSpec Archive::check() { return archive_spec; } -void Archive::extract(ExtractSpec extract_spec) {} +static void _extract_make_dir(ExtractSpec extract_spec, + archive* archive) { + if (extract_spec.make_dir) { + try { + logger::trace("Creating directory {}", extract_spec.dirname.string()); + std::filesystem::create_directories(extract_spec.dirname); + } catch (std::filesystem::filesystem_error& err) { + throw ArchiveException{err.what(), archive}; + } catch (std::bad_alloc& err) { + throw ArchiveException{err.what(), archive}; + } + } +} + +void Archive::extract(ExtractSpec extract_spec) { + _extract_make_dir(extract_spec, this->xwim_archive); +} } // namespace xwim diff --git a/src/archive.hpp b/src/archive.hpp index 7aba918..cb603bb 100644 --- a/src/archive.hpp +++ b/src/archive.hpp @@ -23,7 +23,7 @@ class Archive { ~Archive(); ArchiveSpec check(); - void extract(ExtractSpec normalize_spec); + void extract(ExtractSpec extract_spec); }; class ArchiveException : public std::exception { diff --git a/src/main.cpp b/src/main.cpp index 2df2280..bcf5bc9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,6 +37,8 @@ int main(int argc, char** argv) { extract_spec.extract_subarchive = true; } + logger::info("{}", extract_spec); + archive.extract(extract_spec); } catch (xwim::ArchiveException& ae) { diff --git a/src/spec.hpp b/src/spec.hpp index b6fd8ba..c0bf840 100644 --- a/src/spec.hpp +++ b/src/spec.hpp @@ -47,13 +47,12 @@ struct fmt::formatter { template auto format(const xwim::ExtractSpec& spec, FormatContext& ctx) { - return format_to(ctx.out(), - "ExtractSpec[" + return format_to(ctx.out(), "Extract[" " .make_dir={}," " .dirname={}" " .extract_subarchive={}" " ]", - spec.make_dir, spec.dirname, spec.extract_subarchive); + spec.make_dir, spec.dirname.string(), spec.extract_subarchive); } };