Some example extensions.lua files can be found below. They demonstrate various ways to organize extensions.

Less Clutter

Instead of defining every extension inline, you can use this method to create a neater extensions.lua file. Since the extensions table and each context are both normal lua tables, you can treat them as such and build them piece by piece.

extensions.lua
-- this function serves as an extension function directly
function call_user(c, user)
   app.dial("SIP/" .. user, 60)
end

-- this function returns an extension function
function call_sales_queue(queue)
  return function(c, e)
      app.queue(queue)
   end
end

e = {}

e.default = {}
e.default.include = {"users", "sales"}

e.users = {}
e.users["100"] = call_user
e.users["101"] = call_user

e.sales = {}
e.sales["5000"] = call_sales_queue("sales1")
e.sales["6000"] = call_sales_queue("sales2")

extensions = e

Less Clutter v2

In this example, we use a fancy function to register extensions.

extensions.lua
function register(context, extension, func)
   if not extensions then
      extensions = {}
   end

   if not extensions[context] then
      extensions[context] = {}
   end

   extensions[context][extension] = func
end

function include(context, included_context)
   if not extensions then
      extensions = {}
   end

   if not extensions[context] then
      extensions[context] = {}
   end

   if not extensions[context].include then
      extensions[context].include = {}
   end

   table.insert(extensions[context].include, included_context)
end

-- this function serves as an extension function directly
function call_user(c, user)
   app.dial("SIP/" .. user, 60)
end

-- this function returns an extension function
function call_sales_queue(queue)
  return function(c, e)
      app.queue(queue)
   end
end

include("default", "users")
include("default", "sales")

register("users", "100", call_user)
register("users", "101", call_user)

register("sales", "5000", call_sales_queue("sales1"))
register("sales", "6000", call_sales_queue("sales2"))
register("sales", "7000", function()
   app.queue("sales3")
end)