Current section
Files
Jump to
Current section
Files
src/bt_engine/yaml_parser/yaml_parse_task.erl
-module(yaml_parse_task).
-export([
parse/6
]).
-include("bt_nodes.hrl").
-spec parse(
Task :: {string(), list({term(), term()})},
Namespace :: list(string()),
ParentContext :: map(),
Blackboard :: map(),
YAMLDictionary :: term(),
FileDirectory :: string()
) -> {ParsedTree :: task(), Blackboard :: blackboard()}.
parse(Task = {"task", List}, Namespace, ParentContext, Blackboard, YAMLDictionary, FileDirectory) ->
Decorators = proplists:get_value("decorators", List, []),
parse(Task, Decorators, Namespace, ParentContext, Blackboard, YAMLDictionary, FileDirectory).
parse(_Task = {"task", List}, [], _Namespace, ParentContext, Blackboard, _YAMLDictionary, _FileDirectory) ->
%% just need to assign stuff to the args
UnparsedArgs = proplists:get_value("args", List, []),
Module = proplists:get_value("module", List),
Name = proplists:get_value("name", List, Module),
Args = yaml_parser_utils:parse_args(UnparsedArgs, ParentContext),
%% assume module is a bt_task that exists!
ModuleAtom = list_to_atom(Module),
Params = ModuleAtom:get_params(),
bt_parser_utils:throw_error_if_args_and_params_dont_match(Module, UnparsedArgs, Params),
%% convert decorator
{
#task{
name = Name,
module = ModuleAtom,
args = Args
},
Blackboard
};
parse(Task = {"task", _List}, [Decorator | RestOfDecorators], Namespace, ParentContext, Blackboard, YAMLDictionary, FileDirectory) ->
ParsedDecorator = yaml_parser_utils:get_decorator(Decorator, ParentContext),
{Child, NewBlackboard} = parse(Task, RestOfDecorators, Namespace, ParentContext, Blackboard, YAMLDictionary, FileDirectory),
{
ParsedDecorator#decorator{
child = Child
},
NewBlackboard
}.