add special things to variable blacklist
This commit is contained in:
parent
0d20d2a5b9
commit
a982c4166b
|
@ -3,10 +3,15 @@ defmodule Farmbot.CeleryScript.AST.Node.ReadPin do
|
|||
use Farmbot.CeleryScript.AST.Node
|
||||
allow_args [:pin_number, :label, :pin_mode]
|
||||
|
||||
def execute(%{pin_number: pin_num, pin_mode: mode}, _, env) do
|
||||
def execute(%{pin_number: pin_num, pin_mode: mode, label: label}, _, env) do
|
||||
env = mutate_env(env)
|
||||
case Farmbot.Firmware.read_pin(pin_num, mode) do
|
||||
:ok -> {:ok, env}
|
||||
:ok ->
|
||||
case Farmbot.BotState.get_pin_value(pin_num) do
|
||||
{:ok, val} ->
|
||||
Farmbot.CeleryScript.var(env, label, val)
|
||||
{:error, reason} -> {:error, reason, env}
|
||||
end
|
||||
{:error, reason} -> {:error, reason, env}
|
||||
end
|
||||
end
|
||||
|
|
|
@ -7,7 +7,7 @@ defmodule Farmbot.CeleryScript.AST.Node.SendMessage do
|
|||
def execute(%{message: m, message_type: type}, channels, env) do
|
||||
env = mutate_env(env)
|
||||
{:ok, env, channels} = do_reduce(channels, env, [])
|
||||
bindings = fetch_bindings()
|
||||
bindings = fetch_bindings(env)
|
||||
case sanatize(m) do
|
||||
{:ok, sanatized} ->
|
||||
msg = EEx.eval_string(sanatized, bindings)
|
||||
|
@ -88,11 +88,11 @@ defmodule Farmbot.CeleryScript.AST.Node.SendMessage do
|
|||
end
|
||||
end
|
||||
|
||||
defp fetch_bindings do
|
||||
defp fetch_bindings(env) do
|
||||
bot_state = Farmbot.BotState.force_state_push()
|
||||
pins = Enum.map(bot_state.pins, fn({pin, %{value: value}}) -> {:"pin#{pin}", value} end)
|
||||
location = Enum.map(bot_state.location_data.position, fn({axis, val}) -> {axis, val} end)
|
||||
pins ++ location
|
||||
env.vars ++ pins ++ location
|
||||
end
|
||||
|
||||
defp do_reduce([%{args: %{channel_name: channel}} | rest], env, acc) do
|
||||
|
|
|
@ -37,4 +37,29 @@ defmodule Farmbot.CeleryScript do
|
|||
Module.split(kind) |> List.last() |> Macro.underscore()
|
||||
end
|
||||
|
||||
def var(env, dirty_label, val) do
|
||||
case sanitize_var_name(dirty_label) do
|
||||
{:ok, label} ->
|
||||
new_vars = Keyword.put(env.vars, String.to_atom(label), val)
|
||||
new_env = %{env | vars: new_vars}
|
||||
{:ok, new_env}
|
||||
{:error, reason} ->
|
||||
{:error, reason, env}
|
||||
end
|
||||
end
|
||||
|
||||
defp sanitize_var_name(name) do
|
||||
cond do
|
||||
String.contains?(name, " ") ->
|
||||
{:error, "variables may not contain special characters."}
|
||||
match?(<<"__", _ :: binary>>, name) ->
|
||||
{:error, "variables may not replace internal names."}
|
||||
match?(<<"pin", _ :: binary>>, name) ->
|
||||
{:error, "variables may not contain pattern: pin<number>."}
|
||||
name in ["x", "y", "z"] ->
|
||||
{:error, "variables may not be axis names."}
|
||||
true -> {:ok, name}
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue