-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 }.