Module:USN fleet totals

local data = mw.loadData ('Module:USN fleet totals/data'); -- get the detailed list of ship types and their counts, the grand total of active and reserve ships, and the total planned ships

local get_args = require ('Module:Arguments').getArgs;

--[[--------------------------< R O U N D >--------------------------------------------------------------------

rounds to nearest multiple of 5.

]]

local function round (count)

if 0 == count % 5 then

return count; -- is xx0, xx5 so return unmolested

elseif 2.5 > (count % 5) then

return count - (count % 5); -- is xx1, xx2 so return xx0

else

return count + (5 - (count % 5)); -- is xx3, xx4 so return xx5

end

end

--[[--------------------------< U S N _ F L E E T _ T O T A L S >----------------------------------------------

implements {{USN fleet totals}}

This function returns one of three values according to the text sting in {{{1}}} (frame.args[1]):

active – the 'grand total' (active and reserved fleets) rounded to the nearest multiple of 5 -- {{USN fleet totals|active}}

planned – the 'planned total' (ships under construction or on order) rounded to the nearest multiple of 5 -- {{USN fleet totals|planned}}

retire – number of ships to be decommissioned or taken out of service -- {{USN fleet totals|retire}}

retire-year – planned retirement year farthest in the future -- {{USN fleet totals|retire-year}}

– the long string of fleet totals created by Module:USN fleet totals -- {{USN fleet totals}}

]]

local function USN_fleet_totals (frame)

if 'active' == frame.args[1] then -- number of active and reseved fleet ships

return round (data.grand_total); -- round to nearest multiple of 5

elseif 'planned' == frame.args[1] then -- under construction and on-order ships

return round (data.planned_total); -- round to nearest multiple of 5

elseif 'retire' == frame.args[1] then -- ships to be decommissioned or taken out of service

return round (data.retirements_total); -- round to nearest multiple of 5

elseif 'retire-year' == frame.args[1] then

return data.retirements_year_max;

else -- {{{1}}} is anything else

return data.fleet_totals_str; -- return the detailed fleet totals

end

end

--[[--------------------------< _ D E C O M _ E O S _ C O M M O N >--------------------------------------------

common function to implement {{decommission}} and {{end of service}} templates

]]

local function _decom_eos_common (args_t, phrases_t, template_name)

local out_t = {};

if phrases_t[args_t[1]] then -- is keyword valid?

table.insert (out_t, phrases_t[args_t[1]]); -- yes, get the associated string

elseif args_t[1] then -- no, but not nil so emit appropriate error message

return '{{' .. template_name ..'}}: error: unknown keyword: ' .. args_t[1] .. '';

else -- missing keyword so emit error message

return '{{' .. template_name ..'}}: error: missing keyword'

end

if args_t[2] then -- did we get this optional parameter?

local year = mw.text.trim (args_t[2]):match ('^%d%d%d%d$'); -- attempt to get a four digit year

if year then -- did we find a 'year'? TODO: validate? must be this or a future year? never in the past?

table.insert (out_t, year); -- add the year to the output

else -- here when a four-digit 'year' not found

return '{{' .. template_name ..'}}: error: invalid year';

end

end

return table.concat (out_t, ' '); -- assemble into a big string and done

end

--[[--------------------------< D E C O M M I S S I O N >------------------------------------------------------

implements {{decommission}}

Takes two positional parameters:

{{{1}}} – (required) one of two keywords that cause the template to return an appropriate phrase; phrases are

defined in ~/data. The keywords are 'scheduled' and 'proposed'

{{{2}}} – (optional) year when decommissioning is expected to occur

]]

local function decommission (frame)

local args_t = get_args (frame); -- get parameters from the template into a local table

return _decom_eos_common (args_t, data.decommission_t, 'decommission'); -- call common function to error check the inputs and return the rendered string

end

--[[--------------------------< E N D _ O F _ S E R V I C E >--------------------------------------------------

implements {{end of service}}

Takes two positional parameters:

{{{1}}} – (required) one of two keywords that cause the template to return an appropriate phrase; phrases are

defined in ~/data. The keywords are 'scheduled' and 'proposed'

{{{2}}} – (optional) year when end of service is expected to occur

]]

local function end_of_service (frame)

local args_t = get_args (frame); -- get parameters from the template into a local table

return _decom_eos_common (args_t, data.end_of_service_t, 'end of service'); -- call common function to error check the inputs and return the rendered string

end

--[[--------------------------< E X P O R T S >----------------------------------------------------------------

]]

return

{

USN_fleet_totals = USN_fleet_totals,

decommission = decommission,

end_of_service = end_of_service,

}