## The following macros allow us to push name/desc/sub/... or node.name/node.desc/node.sub/... into node.0.name

<?cs def:copy(__from,__from_str) ?>
<?cs if:(__from && !node.0)?>
  <?cs set:node.0[__from_str] = __from?>
<?cs /if?>
<?cs if:(node[__from_str] && !node.0)?>
  <?cs set:node.0[__from_str] = node[__from_str]?>
<?cs /if?>
<?cs /def?>

<?cs def:copy_list(__from,__from_str) ?>
  <?cs if:(__from.no_header && !node.0)?>
    <?cs set:node.0[__from_str].no_header = __from.no_header?>
  <?cs /if?>
  <?cs if:(node[__from_str].no_header && !node.0)?>
    <?cs set:node.0[__from_str].no_header = node[__from_str].no_header?>
  <?cs /if?>
  <?cs each:_e=__from?>
    <?cs each:_sube=_e?>
     <?cs set:node.0[__from_str][name(_e)][name(_sube)] = _sube?>
    <?cs /each?>
  <?cs /each?>
  <?cs each:_g=__from.group?>
    <?cs each:_subg=_g?>
      <?cs set:node.0[__from_str].group[name(_g)][name(_subg)] = _subg?>
      <?cs each:_subge=_subg?>
        <?cs set:node.0[__from_str].group[name(_g)][name(_subg)][name(_subge)] = _subge?>
      <?cs /each?>
    <?cs /each?>
  <?cs /each?>
  <?cs each:_e=node[__from_str]?>
    <?cs each:_sube=_e?>
     <?cs set:node.0[__from_str][name(_e)][name(_sube)] = _sube?>
    <?cs /each?>
  <?cs /each?>
  <?cs each:_g=node[__from_str].group?>
    <?cs each:_subg=_g?>
      <?cs set:node.0[__from_str].group[name(_g)][name(_subg)] = _subg?>
      <?cs each:_subge=_subg?>
        <?cs set:node.0[__from_str].group[name(_g)][name(_subg)][name(_subge)] = _subge?>
      <?cs /each?>
    <?cs /each?>
  <?cs /each?>
<?cs /def?>

<?cs call:copy(name,"name")?>
<?cs call:copy(desc,"desc")?>
<?cs call:copy_list(pub,"pub")?>
<?cs call:copy_list(goal,"goal")?>
<?cs call:copy_list(result,"result")?>
<?cs call:copy_list(feedback,"feedback")?>
<?cs call:copy_list(act_called,"act_called")?>
<?cs call:copy_list(sub,"sub")?>
<?cs call:copy_list(srv,"srv")?>
<?cs call:copy_list(srv_called,"srv_called")?>
<?cs call:copy_list(param,"param")?>
<?cs call:copy_list(param_set,"param_set")?>
<?cs call:copy_list(req_tf,"req_tf")?>
<?cs call:copy_list(prov_tf,"prov_tf")?>

  <?cs each:_n=node?>
   <?cs each:_l=_n?>
    <?cs each:_e=_l?>
     <?cs if:(name(_e) != 'group')?>
      <?cs each:_sube=_e?>
        <?cs set:_l.group.0[name(_e)][name(_sube)] = _sube?>
      <?cs /each?>
     <?cs /if?>
    <?cs /each?>
   <?cs /each?>
  <?cs /each?>

<?cs def:action_list(__name,__var,node_name)?>
{{{{#!wiki seesaw actions<?cs var:node_name?> all<?cs var:node_name?> 
<?cs if:(subcount(__var))?>
<?cs if:!__var.no_header?>
==== <?cs var:__name?> ====
<?cs /if?>
<?cs each:_group=__var.group?>
<?cs if:_group.name?>
===== <?cs var:_group.name ?> =====
<?cs var:_group.desc ?>
## Need this . to break paragraph
 .
<?cs /if?>
<?cs each:_elem=_group?>
<?cs if:(name(_elem) != 'name' && name(_elem) != 'desc')?>
`<?cs var:_elem.name ?>` ([[<?cs var:_elem.type ?>]])
  <?cs var:_elem.desc ?>
<?cs /if?>
<?cs /each ?>
<?cs /each ?>
<?cs /if?>
}}}}
<?cs /def?>


<?cs def:topic_list(__name,__var,node_name)?>
{{{{#!wiki seesaw topics<?cs var:node_name?> all<?cs var:node_name?>
<?cs if:(subcount(__var))?>
<?cs if:!__var.no_header?>
==== <?cs var:__name?> ====
<?cs /if?>
<?cs each:_group=__var.group?>
<?cs if:_group.name?>
===== <?cs var:_group.name ?> =====
<?cs var:_group.desc ?>
## Need this . to break paragraph
 .
<?cs /if?>
<?cs each:_elem=_group?>
<?cs if:(name(_elem) != 'name' && name(_elem) != 'desc')?>
`<?cs var:_elem.name ?>` (<<MsgLink(<?cs var:_elem.type ?>)>>)
  <?cs var:_elem.desc ?>
<?cs /if?>
<?cs /each ?>
<?cs /each ?>
<?cs /if?>
}}}}
<?cs /def?>


<?cs def:service_list(__name,__var,node_name)?>
{{{{#!wiki seesaw services<?cs var:node_name?> all<?cs var:node_name?>
<?cs if:(subcount(__var))?>
<?cs if:!__var.no_header?>
==== <?cs var:__name?> ====
<?cs /if?>
<?cs each:_group=__var.group?>
<?cs if:_group.name?>
===== <?cs var:_group.name ?> =====
<?cs var:_group.desc ?>
## Need this . to break paragraph
 .
<?cs /if?>
<?cs each:_elem=_group?>
<?cs if:(name(_elem) != 'name' && name(_elem) != 'desc')?>
`<?cs var:_elem.name ?>` (<<SrvLink(<?cs var:_elem.type ?>)>>)
  <?cs var:_elem.desc ?>
<?cs /if?>
<?cs /each ?>
<?cs /each ?>
<?cs /if?>
}}}}
<?cs /def?>


<?cs def:param_list(__name,__var,node_name)?>
{{{{#!wiki seesaw params<?cs var:node_name?> all<?cs var:node_name?>
<?cs if:(subcount(__var))?>
<?cs if:!__var.no_header?>
==== <?cs var:__name?> ====
<?cs /if?>
<?cs each:_group=__var.group?>
<?cs if:_group.name?>
===== <?cs var:_group.name ?> =====
<?cs var:_group.desc ?>
## Need this . to break paragraph
 .
<?cs /if?>
<?cs each:_elem=_group?>
<?cs if:(name(_elem) != 'name' && name(_elem) != 'desc')?>
`<?cs var:_elem.name ?>` (`<?cs var:_elem.type ?>`<?cs if:(_elem.default)?>, default: <?cs var:_elem.default ?><?cs /if?>)
  <?cs var:_elem.desc ?>
<?cs /if?>
<?cs /each ?>
<?cs /each ?>
<?cs /if?>
}}}}
<?cs /def?>


<?cs def:tf_list(__name,__var,node_name)?>
{{{{#!wiki seesaw tf<?cs var:node_name?> all<?cs var:node_name?>
<?cs if:(subcount(__var))?>
<?cs if:!__var.no_header?>
==== <?cs var:__name?> ====
<?cs /if?>
<?cs each:_group=__var.group?>
<?cs if:_group.name?>
===== <?cs var:_group.name ?> =====
<?cs var:_group.desc ?>
## Need this . to break paragraph
 .
<?cs /if?>
<?cs each:_elem=_group?>
<?cs if:(name(_elem) != 'name' && name(_elem) != 'desc')?>
`<?cs var:_elem.from ?>` &rarr; `<?cs var:_elem.to ?>`
  <?cs var:_elem.desc ?>
<?cs /if?>
<?cs /each ?>
<?cs /each ?>
<?cs /if?>
}}}}
<?cs /def?>


<?cs each:_node=node ?>


<?cs if:_node.name?>
=== <?cs var:_node.name ?> ===
<?cs var:_node.desc ?>
 .<?cs if:subcount(_node.sub) || subcount(_node.pub)?>
<<SeeSaw("%topics<?cs var:_node.name ?>/-all<?cs var:_node.name ?>", Topics)>>{{{  }}}
<?cs /if?>
<?cs if:subcount(_node.srv) || subcount(_node.srv_called)?>
<<SeeSaw("%services<?cs var:_node.name ?>/-all<?cs var:_node.name ?>", Services)>>{{{  }}}
<?cs /if?>
<?cs if:subcount(_node.param) || subcount(_node.param_set)?>
<<SeeSaw("%params<?cs var:_node.name ?>/-all<?cs var:_node.name ?>", Params)>>{{{  }}}
<?cs /if?>
<?cs if:subcount(_node.req_tf)|| subcount(_node.prov_tf)?>
<<SeeSaw("%tf<?cs var:_node.name ?>/-all<?cs var:_node.name ?>", tf)>>{{{  }}}
<?cs /if?>
<?cs if:subcount(_node.act_called)?>
<<SeeSaw("%actions<?cs var:_node.name ?>/-all<?cs var:_node.name ?>", Actions)>>{{{  }}}
<?cs /if?>
<<SeeSaw("%all<?cs var:_node.name ?>", All)>>{{{  }}}
<?cs /if?>
<?cs if:!_node.name?>
<<SeeSaw("all<?cs var:_node.name ?>", show=True)>>
<?cs /if?>
<?cs call:topic_list("Action Goal", _node.goal,_node.name)?>
<?cs call:topic_list("Action Result", _node.result, _node.name)?>
<?cs call:topic_list("Action Feedback", _node.feedback, _node.name)?>
<?cs call:action_list("Actions Called", _node.act_called, _node.name)?>
<?cs call:topic_list("Subscribed Topics", _node.sub, _node.name)?>
<?cs call:topic_list("Published Topics", _node.pub, _node.name)?>
<?cs call:service_list("Services", _node.srv, _node.name)?>
<?cs call:service_list("Services Called", _node.srv_called, _node.name)?>
<?cs call:param_list("Parameters", _node.param, _node.name)?>
<?cs call:param_list("Parameters Set", _node.param_set, _node.name)?>
<?cs call:tf_list("Required tf Transforms", _node.req_tf, _node.name)?>
<?cs call:tf_list("Provided tf Transforms", _node.prov_tf, _node.name)?>

<?cs /each ?>