La documentazione per questo modulo può essere creata in Modulo:Data/man

local getArgs = require('Modulo:Arguments').getArgs
require('strict')

-------------------------------------------------------------------------------
--                    Funzioni di utilità
-------------------------------------------------------------------------------

local function isValidDate(date)
	return pcall(function() mw.getContentLanguage():formatDate('', date) end)
end

-- Controlla args.inizio e args.fine e li ritorna in Unix time
local function parseArgs(args)
	if not args.inizio then
		error('la data di inizio è obbligatoria', 2)
	elseif not isValidDate(args.inizio) then
		error('la data di inizio non è valida', 2)
	elseif not args.fine then
		error('la data di fine è obbligatoria', 2)
	elseif not isValidDate(args.fine) then
		error('la data di fine non è valida', 2)
	end

	return { 
		d1_ut = tonumber(mw.getContentLanguage():formatDate('U', args.inizio, true)),
		d2_ut = tonumber(mw.getContentLanguage():formatDate('U', args.fine, true))
	}
end

-- Controlla args.data e la ritorna in Unix time
local function parseArgs2(args)
	if not args.data then
		error('la data è obbligatoria', 2)
	elseif not isValidDate(args.data) then
		error('la data di inizio non è valida', 2)
	end

	return { 
		d = tonumber(mw.getContentLanguage():formatDate('U', args.data, true)),
	}
end

-- Error handler per xpcall, formatta l'errore
local function errhandler(msg)
	return string.format('<span class="error">Errore: %s</span>', msg)
end

-------------------------------------------------------------------------------
--                               dateDiff
-------------------------------------------------------------------------------

-- Ritorna la differenza tra le date d1 e d2 (Unix time) in solo una tra le unità:
-- anni, mesi, settimane, giorni, ore, minuti e secondi.
local function dateDiff(d1_ut, d2_ut)
	return math.floor((d2_ut - d1_ut) / 86400);
end

-------------------------------------------------------------------------------
--                                    API
-------------------------------------------------------------------------------

local p = {}

-- Per utilizzare diff da un altro modulo.
function p._diff(args)
	local success, result = xpcall(function() return parseArgs(args) end, errhandler)
	return success and dateDiff(result.d1_ut, result.d2_ut) or result
end
-- Entry point per {{#invoke:Data|diff}}
function p.diff(frame)
	return p._diff(getArgs(frame))
end

-- Per utilizzare getDay da un altro modulo.
function p._getDay(args)
	local success, result = xpcall(function() return parseArgs2(args) end, errhandler)
	return success and os.date("*t", result.d).day or result
end
-- Entry point per {{#invoke:Data|getDay}}
function p.getDay(frame)
	return p._getDay(getArgs(frame))
end

-- Per utilizzare getMonth da un altro modulo.
function p._getMonth(args)
	local success, result = xpcall(function() return parseArgs2(args) end, errhandler)
	return success and os.date("*t", result.d).month or result
end
-- Entry point per {{#invoke:Data|getMonth}}
function p.getMonth(frame)
	return p._getMonth(getArgs(frame))
end

-- Per utilizzare getYear da un altro modulo.
function p._getYear(args)
	local success, result = xpcall(function() return parseArgs2(args) end, errhandler)
	return success and os.date("*t", result.d).year or result
end
-- Entry point per {{#invoke:Data|getYear}}
function p.getYear(frame)
	return p._getYear(getArgs(frame))
end

return p