defmodule FarmbotCeleryScript.AST.Factory do @moduledoc """ Helpers for creating ASTs. """ alias FarmbotCeleryScript.AST def new do %AST{body: []} end def new(kind, args \\ %{}, body \\ []) do AST.new(kind, Map.new(args), body) end def rpc_request(%AST{} = ast, label) when is_binary(label) do %AST{ast | kind: :rpc_request, args: %{label: label}, body: []} end def execute(%AST{} = ast, sequence_id) do ast |> add_body_node(new(:execute, %{sequence_id: sequence_id})) end def read_pin(%AST{} = ast, pin_number, pin_mode) do ast |> add_body_node(new(:read_pin, %{pin_number: pin_number, pin_mode: pin_mode})) end def set_pin_io_mode(%AST{} = ast, pin_number, pin_io_mode) do ast |> add_body_node(new(:set_pin_io_mode, %{pin_number: pin_number, pin_io_mode: pin_io_mode})) end def dump_info(%AST{} = ast) do ast |> add_body_node(new(:dump_info)) end def emergency_lock(%AST{} = ast) do ast |> add_body_node(new(:emergency_lock)) end def emergency_unlock(%AST{} = ast) do ast |> add_body_node(new(:emergency_unlock)) end def read_status(%AST{} = ast) do ast |> add_body_node(new(:read_status)) end def power_off(%AST{} = ast) do ast |> add_body_node(new(:power_off)) end def reboot(%AST{} = ast) do ast |> add_body_node(new(:reboot)) end def sync(%AST{} = ast) do ast |> add_body_node(new(:sync)) end def take_photo(%AST{} = ast) do ast |> add_body_node(new(:take_photo)) end def flash_firmware(%AST{} = ast, package) when is_binary(package) do ast |> add_body_node(new(:flash_firmware, %{package: package})) end def add_body_node(%AST{body: body} = ast, %AST{} = body_node) do %{ast | body: body ++ [body_node]} end def factory_reset(%AST{} = ast, package) do ast |> add_body_node(new(:factory_reset, %{package: package})) end end