From daa0c51db599ae6359d5e0307cd233908660c413 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sat, 18 Jul 2020 11:03:14 -0400 Subject: [PATCH] Fix filter score/weight being converted to string --- lib/frenzy/json_schema.ex | 39 +++++++++++++++++++ .../live/configure_stage/filter_stage_live.ex | 5 ++- 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 lib/frenzy/json_schema.ex diff --git a/lib/frenzy/json_schema.ex b/lib/frenzy/json_schema.ex new file mode 100644 index 0000000..ad15046 --- /dev/null +++ b/lib/frenzy/json_schema.ex @@ -0,0 +1,39 @@ +defmodule Frenzy.JSONSchema do + @enforce_keys [:value, :schema] + defstruct [:value, :schema] + + @type t() :: %__MODULE__{ + value: map(), + schema: schema() + } + + @type schema() :: + :string + | :boolean + | :integer + | {:list, schema()} + | %{required(String.t()) => schema()} + + @spec coerce(schema :: schema(), value :: map() | list() | String.t()) :: map() + + def coerce(:string, value) when is_binary(value), do: value + + def coerce(:boolean, "true"), do: true + def coerce(:boolean, _), do: false + + def coerce(:integer, value) when is_binary(value) do + {res, _} = Integer.parse(value) + res + end + + def coerce({:list, list_type}, list_value) when is_list(list_value) do + Enum.map(list_value, &coerce(list_type, &1)) + end + + def coerce(schema, map_value) when is_map(schema) and is_map(map_value) do + Enum.reduce(schema, %{}, fn {key, value_schema}, acc -> + value = Map.fetch!(map_value, key) + Map.put(acc, key, coerce(value_schema, value)) + end) + end +end diff --git a/lib/frenzy_web/live/configure_stage/filter_stage_live.ex b/lib/frenzy_web/live/configure_stage/filter_stage_live.ex index c721dda..75fa0ba 100644 --- a/lib/frenzy_web/live/configure_stage/filter_stage_live.ex +++ b/lib/frenzy_web/live/configure_stage/filter_stage_live.ex @@ -1,5 +1,6 @@ defmodule FrenzyWeb.ConfigureStage.FilterStageLive do use FrenzyWeb, :live_component + alias Frenzy.JSONSchema @impl true def update(assigns, socket) do @@ -12,7 +13,7 @@ defmodule FrenzyWeb.ConfigureStage.FilterStageLive do new_opts = socket.assigns.opts |> Map.put("mode", mode) - |> Map.put("score", score) + |> Map.put("score", JSONSchema.coerce(:integer, score)) new_stage = Frenzy.Keypath.set(socket.assigns.stage, socket.assigns.keypath, new_opts) @@ -63,7 +64,7 @@ defmodule FrenzyWeb.ConfigureStage.FilterStageLive do |> Map.put("mode", mode) |> Map.put("param", param) |> Map.put("property", property) - |> Map.put("weight", weight) + |> Map.put("weight", JSONSchema.coerce(:integer, weight)) new_stage = Frenzy.Keypath.set(