///|
pub(all) struct PackStatistics {
name : String
jobs : Int
templates : Array[String]
presets : Array[String]
themes : Array[String]
total_title_characters : Int
image_slots : Int
} derive(Debug, Eq, ToJson)
///|
fn add_unique(values : Array[String], value : String) -> Array[String] {
if values.any(item => item == value) {
values
} else {
let result = values.copy()
result.push(value)
result
}
}
///|
pub fn pack_statistics(pack : CampaignPack) -> PackStatistics {
let templates : Array[String] = []
let presets : Array[String] = []
let themes : Array[String] = []
let mut title_characters = 0
let mut image_slots = 0
pack.jobs.each(job => {
let new_templates = add_unique(templates, job.template)
let new_presets = add_unique(presets, job.preset)
let new_themes = add_unique(themes, job.theme)
templates.clear()
templates.push_iter(new_templates.iter())
presets.clear()
presets.push_iter(new_presets.iter())
themes.clear()
themes.push_iter(new_themes.iter())
title_characters = title_characters + job.content.title.char_length()
if job.content.image_asset_id.trim().is_empty() == false {
image_slots = image_slots + 1
}
})
{
name: pack.name,
jobs: pack.jobs.length(),
templates,
presets,
themes,
total_title_characters: title_characters,
image_slots,
}
}
///|
pub fn packs_with_template(template : String) -> Array[CampaignPack] {
all_packs().filter(pack => pack.jobs.any(job => job.template == template))
}
///|
pub fn packs_with_preset(preset : String) -> Array[CampaignPack] {
all_packs().filter(pack => pack.jobs.any(job => job.preset == preset))
}
///|
pub fn catalog_job_count() -> Int {
all_packs().fold(init=0, (total, pack) => total + pack.jobs.length())
}
///|
pub fn catalog_template_count() -> Int {
let names : Array[String] = []
all_packs().each(pack => {
pack.jobs.each(job => {
if names.any(name => name == job.template) == false {
names.push(job.template)
}
})
})
names.length()
}