+
+using json = nlohmann::json;
+
+// We ned to manually unwrap numbers
+template <typename T>
+result<T> get(json const &j) {
+ T r;
+ std::istringstream s(j.get<std::string>());
+ s >> r;
+ return s.fail() ? Err<T>("Could not read int") : Ok(r);
+}
+
+struct wm::area area_from_json(json const &j) {
+ return wm::area{
+ j["name"].get<std::string>(),
+ {
+ get<uint32_t>(j["width"]).unwrap(),
+ get<uint32_t>(j["height"]).unwrap(),
+ get<int32_t>(j["x"]).unwrap(),
+ get<int32_t>(j["y"]).unwrap(),
+ },
+ get<uint32_t>(j["zorder"]).unwrap(),
+ };
+}
+
+struct layout layout_from_json(json const &j) {
+ auto &ja = j["areas"];
+
+ auto l = wm::layout{j["name"].get<std::string>(), uint32_t(ja.size()), {}};
+
+ logdebug("Loading layout '%s' with %u areas", l.name.c_str(),
+ unsigned(ja.size()));
+
+ std::transform(std::cbegin(ja), std::cend(ja), std::begin(l.areas),
+ area_from_json);
+
+ return l;
+}
+
+struct result<layouts_type> load_layout(char const *filename) {
+ json jlayouts;
+ std::ifstream i(filename);
+ i >> jlayouts;
+
+ size_t nlayouts = jlayouts.size();
+ auto layouts = layouts_type(nlayouts);
+
+ std::transform(std::cbegin(jlayouts), std::cend(jlayouts),
+ std::begin(layouts), layout_from_json);
+
+ return Ok(layouts);
+}
+