Commit a839b92b authored by Paul Asmuth's avatar Paul Asmuth
Browse files

linechart: consistent property parsing

parent ec95d7c6
Loading
Loading
Loading
Loading
+8 −53
Original line number Diff line number Diff line
@@ -149,51 +149,6 @@ ReturnCode draw(
  return ReturnCode::success();
}

ReturnCode configureAxisTop(const plist::Property& prop, LinechartConfig* config) {
  if (prop.size() != 1) {
    return ReturnCode::errorf(
        "EARG",
        "incorrect number of arguments; expected: 1, got: $0",
        prop.size());
  }

  return parseAxisMode(prop[0], &config->axis_top.mode);
}

ReturnCode configureAxisRight(const plist::Property& prop, LinechartConfig* config) {
  if (prop.size() != 1) {
    return ReturnCode::errorf(
        "EARG",
        "incorrect number of arguments; expected: 1, got: $0",
        prop.size());
  }

  return parseAxisMode(prop[0], &config->axis_right.mode);
}

ReturnCode configureAxisBottom(const plist::Property& prop, LinechartConfig* config) {
  if (prop.size() != 1) {
    return ReturnCode::errorf(
        "EARG",
        "incorrect number of arguments; expected: 1, got: $0",
        prop.size());
  }

  return parseAxisMode(prop[0], &config->axis_bottom.mode);
}

ReturnCode configureAxisLeft(const plist::Property& prop, LinechartConfig* config) {
  if (prop.size() != 1) {
    return ReturnCode::errorf(
        "EARG",
        "incorrect number of arguments; expected: 1, got: $0",
        prop.size());
  }

  return parseAxisMode(prop[0], &config->axis_left.mode);
}


ReturnCode configureSeries(const plist::Property& prop, LinechartConfig* config) {
  if (!prop.child) {
    return ERROR_INVALID_ARGUMENT;
@@ -214,16 +169,16 @@ ReturnCode configureSeries(const plist::Property& prop, LinechartConfig* config)
}

ReturnCode configure(const plist::PropertyList& plist, ElementRef* elem) {
  static const PropertyDefinitions<LinechartConfig> pdefs = {
    {"axis-top", &configureAxisTop},
    {"axis-right", &configureAxisRight},
    {"axis-bottom", &configureAxisBottom},
    {"axis-left", &configureAxisLeft},
    {"series", &configureSeries},
  LinechartConfig config;
  static const ParserDefinitions pdefs = {
    {"axis-top", std::bind(&parseAxisModeProp, std::placeholders::_1, &config.axis_top.mode)},
    {"axis-right", std::bind(&parseAxisModeProp, std::placeholders::_1, &config.axis_right.mode)},
    {"axis-bottom", std::bind(&parseAxisModeProp, std::placeholders::_1, &config.axis_bottom.mode)},
    {"axis-left", std::bind(&parseAxisModeProp, std::placeholders::_1, &config.axis_left.mode)},
    {"series", std::bind(&configureSeries, std::placeholders::_1, &config)},
  };

  LinechartConfig config;
  if (auto rc = configureProperties(plist, pdefs, &config); !rc.isSuccess()) {
  if (auto rc = parseAll(plist, pdefs); !rc.isSuccess()) {
    return rc;
  }

+11 −0
Original line number Diff line number Diff line
@@ -57,6 +57,17 @@ ReturnCode parseAxisMode(
  return parseEnum(defs, str, value);
}

ReturnCode parseAxisModeProp(const plist::Property& prop, AxisMode* value) {
  if (prop.size() != 1) {
    return ReturnCode::errorf(
        "EARG",
        "incorrect number of arguments; expected: 1, got: $0",
        prop.size());
  }

  return parseAxisMode(prop[0], value);
}

static Status renderAxisVertical(
    const AxisDefinition& axis_config,
    double x,
+5 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include <utility>
#include <string>
#include <vector>
#include <plist/plist.h>
#include <graphics/layer.h>
#include <graphics/viewport.h>
#include <utils/return_code.h>
@@ -79,6 +80,10 @@ ReturnCode parseAxisMode(
    const std::string& str,
    AxisMode* value);

ReturnCode parseAxisModeProp(
    const plist::Property& prop,
    AxisMode* value);

Status renderAxis(
    const AxisDefinition& axis,
    const Rectangle& clip,
+0 −28
Original line number Diff line number Diff line
@@ -59,34 +59,6 @@ inline ReturnCode parseAll(
  return ReturnCode::success();
}

template <typename T>
using PropertyDefinitions = std::unordered_map<
    std::string,
    std::function<ReturnCode (const plist::Property&, T*)>>;

template<typename T>
ReturnCode configureProperties(
    const plist::PropertyList& plist,
    const PropertyDefinitions<T>& pdefs,
    T* config) {
  for (const auto& prop : plist) {
    const auto& pdef = pdefs.find(prop.name);
    if (pdef != pdefs.end()) {
      if (auto rc = pdef->second(prop, config); !rc.isSuccess()) {
        return ReturnCode::errorf(
            "EPARSE",
            "error while parsing property '$0': $1",
            prop.name,
            rc.getMessage());

        return rc;
      }
    }
  }

  return ReturnCode::success();
}

template <typename T>
using EnumDefinitions = std::unordered_map<std::string, T>;

+3 −0
Original line number Diff line number Diff line
@@ -3,3 +3,6 @@ linechart
    axis-right -> off, auto, manual
    axis-bottom -> off auto, manual
    axis-left -> off, auto, manual
    series
        xs -> data
        ys -> data