#meta

Implements useful template functions

-- priority: 10
-- Template API root table
template = {}
-- Template storage table
templates = {}

-- Iterates over a table/array and applies a function to each element,
-- concatenating the results
function template.each(tbl, fn)
    local result = {}
    for _, item in ipairs(tbl) do
        table.insert(result, fn(item))
    end
    return table.concat(result)
end

-- Creates a new template function from a string template
function template.new(template_str)
  -- Preprocess: strip indentation
  local lines = {}
  local split_lines = string.split(template_str, "\n")
  for _, line in ipairs(split_lines) do
    line = string.gsub(line, "^    ", "")
    table.insert(lines, line)
  end
  template_str = table.concat(lines, "\n")
  return function(obj)
    return space_lua.interpolate(template_str, obj)
  end
end

-- Creates a template-based slash command, keys for def are:
--   name: name of the slash command
--   description: description of the slash command
--   only_contexts: parent AST nodes in which this slash command is available, defaults to everywhere
--   except_contexts: parent AST nodes in which this slash command is not available
--   template: template function to apply
--   insert_at: position to insert the template into
--   match: match string to apply the template to
--   match_regex: match regex to apply the template to
function template.define_slash_command(def)
  slash_command.define {
    name = def.name,
    description = def.description,
    onlyContexts = def.only_contexts,
    exceptContexts = def.except_contexts,
    run = function()
      system.invoke_function("template.applySnippetTemplate", def.template(), {
        insertAt = def.insert_at,
        match = def.match,
        matchRegex = def.match_regex
      })
    end
  }
end