tiger_lib/imperator/data/
setup_characters.rs

1use crate::block::Block;
2use crate::context::ScopeContext;
3use crate::db::{Db, DbKind};
4use crate::everything::Everything;
5use crate::game::GameFlags;
6use crate::imperator::effect_validation::validate_create_character;
7use crate::item::{Item, ItemLoader, LoadAsFile, Recursive};
8use crate::pdxfile::PdxEncoding;
9use crate::scopes::Scopes;
10use crate::special_tokens::SpecialTokens;
11use crate::token::Token;
12use crate::tooltipped::Tooltipped;
13use crate::validator::Validator;
14
15#[derive(Clone, Debug)]
16pub struct SetupCharacters {}
17
18inventory::submit! {
19    ItemLoader::Normal(GameFlags::Imperator, Item::SetupCharacters, SetupCharacters::add)
20}
21
22impl SetupCharacters {
23    pub fn add(db: &mut Db, key: Token, block: Block) {
24        db.add(Item::SetupCharacters, key, block, Box::new(Self {}));
25    }
26}
27
28impl DbKind for SetupCharacters {
29    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
30        let mut vd = Validator::new(block, data);
31        let mut sc = ScopeContext::new(Scopes::Character, key);
32        vd.field_item("country", Item::Localization);
33        vd.unknown_block_fields(|key, block| {
34            let vd = Validator::new(block, data);
35            validate_create_character(
36                key,
37                block,
38                data,
39                &mut sc,
40                vd,
41                Tooltipped::No,
42                &mut SpecialTokens::none(),
43            );
44        });
45    }
46}
47
48#[derive(Clone, Debug)]
49pub struct PostSetupCharacters {}
50
51inventory::submit! {
52    ItemLoader::Full(GameFlags::all(), Item::PostSetupCharacters, PdxEncoding::Utf8OptionalBom, ".txt", LoadAsFile::Yes, Recursive::No, PostSetupCharacters::add)
53}
54
55impl PostSetupCharacters {
56    pub fn add(db: &mut Db, key: Token, block: Block) {
57        db.add(Item::PostSetupCharacters, key, block, Box::new(Self {}));
58    }
59}
60
61impl DbKind for PostSetupCharacters {
62    fn validate(&self, _key: &Token, block: &Block, data: &Everything) {
63        let mut vd = Validator::new(block, data);
64        vd.field_validated_block("country", |block, data| {
65            let mut vd = Validator::new(block, data);
66            vd.field_validated_block("countries", |block, data| {
67                let mut vd = Validator::new(block, data);
68                vd.unknown_block_fields(|key, block| {
69                    data.verify_exists(Item::Localization, key);
70                    let mut vd = Validator::new(block, data);
71                    vd.multi_field_validated_block("ruler_term", |block, data| {
72                        let mut vd = Validator::new(block, data);
73                        vd.field_integer("character");
74                        vd.field_date("start_date");
75                        vd.field_item("government", Item::GovernmentType);
76                    });
77                });
78            });
79        });
80    }
81}