farmbot_os/lib/farmbot/celery_script/commands/data_update.ex

74 lines
2.0 KiB
Elixir

defmodule Farmbot.CeleryScript.Command.DataUpdate do
@moduledoc """
SyncInvalidate
"""
alias Farmbot.CeleryScript.Command
alias Farmbot.Database
alias Database.Syncable.{
Device,
FarmEvent,
Peripheral,
Point,
Regimen,
Sequence,
Tool
}
use Farmbot.DebugLog
@behaviour Command
@typedoc """
The verb from DataUpdate:
https://github.com/FarmBot/farmbot-js/blob/master/src/corpus.ts#L611
"""
@type verb :: :add | :remove | :update
@doc ~s"""
SyncInvalidate
args: %{value: String.t},
body: [Pair.t]
"""
@spec run(%{value: String.t}, [Pair.t], Ast.context) :: Ast.context
def run(%{value: verb}, pairs, context) do
verb = parse_verb_str(verb)
Enum.each(pairs, fn(%{args: %{label: s, value: nowc}}) ->
syncable = s |> parse_syncable_str()
if syncable do
value = nowc |> parse_val_str()
:ok = Database.set_awaiting(context, syncable, verb, value)
else
:ok
end
end)
context
end
@type number_or_wildcard :: non_neg_integer | binary # "*"
@type syncable :: Farmbot.Database.syncable | nil
@spec parse_syncable_str(binary) :: syncable
defp parse_syncable_str("regimens"), do: Regimen
defp parse_syncable_str("peripherals"), do: Peripheral
defp parse_syncable_str("sequences"), do: Sequence
defp parse_syncable_str("farm_events"), do: FarmEvent
defp parse_syncable_str("tools"), do: Tool
defp parse_syncable_str("points"), do: Point
defp parse_syncable_str("device"), do: Device
defp parse_syncable_str(str) do
debug_log "no such syncable: #{str}"
nil
end
@spec parse_val_str(binary) :: number_or_wildcard
defp parse_val_str("*"), do: "*"
defp parse_val_str(int) when is_integer(int), do: int
defp parse_val_str(number), do: String.to_integer(number)
@spec parse_verb_str(binary) :: verb
defp parse_verb_str("add"), do: :add
defp parse_verb_str("remove"), do: :remove
defp parse_verb_str("update"), do: :update
end