1use crate::block::Block;
2use crate::db::{Db, DbKind};
3use crate::everything::Everything;
4use crate::game::GameFlags;
5use crate::item::{Item, ItemLoader, LoadAsFile, Recursive};
6use crate::pdxfile::PdxEncoding;
7use crate::report::{ErrorKey, Severity, untidy, warn};
8use crate::token::Token;
9use crate::validator::Validator;
10
11#[derive(Clone, Debug)]
12pub struct Font {}
13
14inventory::submit! {
15 ItemLoader::Full(GameFlags::jomini(), Item::Font, PdxEncoding::Utf8OptionalBom, ".font", LoadAsFile::No, Recursive::Yes, Font::add)
16}
17
18impl Font {
19 pub fn add(db: &mut Db, key: Token, block: Block) {
20 if key.is("fontfiles") {
21 if let Some(name) = block.get_field_value("name") {
22 db.add(Item::Fontfiles, name.clone(), block, Box::new(Fontfiles {}));
23 } else {
24 let msg = "fontfiles entry without name";
25 warn(ErrorKey::FieldMissing).msg(msg).loc(key).push();
26 }
27 } else if key.is("font") {
28 if let Some(name) = block.get_field_value("name") {
29 db.add(Item::Font, name.clone(), block, Box::new(Self {}));
30 } else {
31 let msg = "font entry without name";
32 warn(ErrorKey::FieldMissing).msg(msg).loc(key).push();
33 }
34 } else {
35 let msg = format!("unknown entry type {key}");
36 untidy(ErrorKey::UnknownField).msg(msg).loc(key).push();
37 }
38 }
39}
40
41impl DbKind for Font {
42 fn validate(&self, _key: &Token, block: &Block, data: &Everything) {
43 let mut vd = Validator::new(block, data);
44 vd.set_max_severity(Severity::Warning);
45 vd.field_value("name");
46 vd.multi_field_validated_block("fontstyle", |block, data| {
47 let mut vd = Validator::new(block, data);
48 vd.field_validated_value("style", |_, mut vd| {
49 for mut vd in vd.split('|') {
50 vd.choice(&[
51 "regular",
52 #[cfg(feature = "eu5")]
53 "semibold",
54 "bold",
55 "extrabold",
56 "italic",
57 ]);
58 }
59 });
60 vd.field_item("fontfiles", Item::Fontfiles);
61 });
62 vd.multi_field_validated_block("underlineformats", |block, data| {
63 let mut vd = Validator::new(block, data);
64 vd.unknown_block_fields(|_key, block| {
65 let mut vd = Validator::new(block, data);
67 vd.field_numeric("thickness");
68 vd.field_numeric("offset");
69 });
70 });
71 }
72}
73
74#[derive(Clone, Debug)]
75pub struct Fontfiles {}
76
77impl DbKind for Fontfiles {
78 fn validate(&self, _key: &Token, block: &Block, data: &Everything) {
79 let mut vd = Validator::new(block, data);
80 vd.set_max_severity(Severity::Warning);
81 vd.field_value("name");
82 vd.field_bool("always_load");
83
84 vd.multi_field_validated_block("group", |block, data| {
85 let mut vd = Validator::new(block, data);
86 vd.field_list("languages"); vd.field_list_items("files", Item::File);
88 });
89 }
90}