diff options
Diffstat (limited to 'anim/serialize.cpp')
-rw-r--r-- | anim/serialize.cpp | 67 |
1 files changed, 11 insertions, 56 deletions
diff --git a/anim/serialize.cpp b/anim/serialize.cpp index 2a0b5a45..3aca6201 100644 --- a/anim/serialize.cpp +++ b/anim/serialize.cpp @@ -10,47 +10,9 @@ using Corrade::Utility::Debug; using Corrade::Utility::Error; -static constexpr -std::pair<anim_direction, const char*> anim_direction_map[] = { - { anim_direction::N, "n" }, - { anim_direction::NE, "ne" }, - { anim_direction::E, "e" }, - { anim_direction::SE, "se" }, - { anim_direction::S, "s" }, - { anim_direction::SW, "sw" }, - { anim_direction::W, "w" }, - { anim_direction::NW, "nw" }, -}; - -const char* anim_group::direction_to_string(anim_direction group) -{ - auto it = std::find_if(std::cbegin(anim_direction_map), std::cend(anim_direction_map), - [=](const auto& pair) { return group == pair.first; }); - if (it != std::cend(anim_direction_map)) - return it->second; - else - return "(unknown)"; -} - -anim_direction anim_group::string_to_direction(const std::string& str) -{ - auto it = std::find_if(std::cbegin(anim_direction_map), std::cend(anim_direction_map), - [&](const auto& pair) { return str == pair.second; }); - if (it != std::cend(anim_direction_map)) - return it->first; - else - return (anim_direction)0; -} - namespace nlohmann { template<> -struct adl_serializer<anim_direction> final { - static void to_json(json& j, anim_direction x); - static void from_json(const json& j, anim_direction& x); -}; - -template<> struct adl_serializer<Magnum::Vector2i> final { static void to_json(json& j, const Magnum::Vector2i& x); static void from_json(const json& j, Magnum::Vector2i& x); @@ -68,25 +30,13 @@ void adl_serializer<Magnum::Vector2i>::from_json(const json& j, Magnum::Vector2i j.at("y").get_to(x[1]); } -#if 0 -void adl_serializer<anim_direction>::to_json(json& j, anim_direction x) -{ - j = anim_group::direction_to_string(x); -} - -void adl_serializer<anim_direction>::from_json(const json& j, anim_direction& x) -{ - x = anim_group::string_to_direction(j); -} -#endif - } // namespace nlohmann NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim_frame, ground, offset, size); NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim_group, name, frames, ground); NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(anim, name, nframes, actionframe, fps, groups); -std::optional<anim> anim::from_json(const std::filesystem::path& pathname) +std::tuple<anim, bool> anim::from_json(const std::filesystem::path& pathname) { using namespace nlohmann; std::ifstream s; @@ -95,7 +45,7 @@ std::optional<anim> anim::from_json(const std::filesystem::path& pathname) s.open(pathname, std::ios_base::in); } catch (const std::ios::failure& e) { Error{} << "failed to open" << pathname << ':' << e.what(); - return std::nullopt; + return { {}, false }; } anim ret; try { @@ -105,9 +55,9 @@ std::optional<anim> anim::from_json(const std::filesystem::path& pathname) from_json(j, ret); } catch (const std::exception& e) { Error{} << "failed to parse" << pathname << ':' << e.what(); - return std::nullopt; + return { {}, false }; } - return std::make_optional(std::move(ret)); + return { std::move(ret), true }; } bool anim::to_json(const std::filesystem::path& pathname) @@ -122,8 +72,13 @@ bool anim::to_json(const std::filesystem::path& pathname) Error{} << "failed to open" << pathname << "for writing:" << e.what(); return false; } - s << j.dump(4); - s.flush(); + try { + s << j.dump(4); + s.flush(); + } catch (const std::exception& e) { + Error{} << "failed writing" << pathname << ':' << e.what(); + return false; + } return true; } |