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

This function returns one of three values according to the text sting in (frame.args[1]): active – the 'grand total' (active and reserved fleets) rounded to the nearest multiple of 5					-- planned – the 'planned total' (ships under construction or on order) rounded to the nearest multiple of 5		-- retire – number of ships to be decommissioned or taken out of service											-- retire-year – planned retirement year farthest in the future													-- – the long string of fleet totals created by Module: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																		-- 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 and  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 ' : error: unknown keyword: ' .. args_t[1] .. ' ';	else																		-- missing keyword so emit error message return ' : 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 ' : 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

Takes two positional parameters: – (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' – (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

Takes two positional parameters: – (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' – (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, }