Module:Sandbox/TiiJ7/StringBuilder

------------------------------------------------------------

-- Quick module to help creating a concatenated string.

-- To be used in other modules.

--

-- By User:TiiJ7

------------------------------------------------------------

local StringBuilder = {}

StringBuilder.__index = StringBuilder

local StringBuilderModes = { convert = true, ignore = true, error = true }

-- Creates a new string builder

function StringBuilder.new()

local sb = {}

setmetatable(sb,StringBuilder)

sb._buffer = {}

sb._mode = 'convert'

sb._separator = ''

return sb

end

-- Sets the mode of the string builder, see doc

function StringBuilder:setMode(mode)

if not mode then return self end

if StringBuilderModes[mode] then

self._mode = mode

end

return self -- Method chaining

end

-- Sets the separator with which the strings are concatted

function StringBuilder:setSeparator(separator)

if not separator then return self end

separator = tostring(separator)

if separator ~= nil then self._separator = separator end

return self -- Method chaining

end

-- Appends a string

function StringBuilder:append(str)

if str then

self:_addString(str,self._buffer)

end

return self -- Method chaining

end

-- Appends multiple strings

function StringBuilder:appendAll(...)

local argcount = select('#',...)

if argcount then

local b = self._buffer

local f = self._addString

for i=1,argcount do

f(self,select(i,...),b)

end

end

return self -- Method chaining

end

-- Clears the internal buffer

function StringBuilder:clear()

local b = self._buffer

for i=1,#b do

b[i] = nil

end

return self -- Method chaining

end

-- Returns the result as a string

function StringBuilder:toString()

local b = self._buffer

if #b == 0 then return '' end

return table.concat(b,self._separator)

end

-- Adds a single string

function StringBuilder:_addString(str,t)

if type(str) ~= 'string' and type(str) ~= 'number' then

local m = self._mode

if m == 'convert' then

str = tostring(str)

if not str then return end

elseif m == 'error' then

error( 'ERROR: Trying to append object of type "' .. type(str) .. '"' )

else

return

end

end

t[#t+1] = str

end

-- Meta tostring function

function StringBuilder:__tostring()

return self:toString()

end

-- Some function aliases...

StringBuilder.a = StringBuilder.append

StringBuilder.aa = StringBuilder.appendAll

StringBuilder.c = StringBuilder.clear

StringBuilder.m = StringBuilder.setMode

StringBuilder.s = StringBuilder.setSeparator

return StringBuilder