factorio-frontend 0.1.3

Rust frontend that lowers Factorio mod sources into factorio-ir
Documentation
#![allow(clippy::unwrap_used)]

use factorio_frontend::parse_module;
use factorio_ir::locale::{LocaleEntry, LocaleFile};

#[test]
fn locale_macro_resolves_setting_const_keys() {
    let source = r#"
        use factorio_rs::prelude::*;

        factorio_rs::mod_settings! {
            prefix = "msr",
            startup {
                casual_mode: bool = false,
            }
        }

        factorio_rs::locale! {
            file = "settings",
            en {
                mod_setting_name {
                    Settings::CASUAL_MODE = "Casual mode",
                }
                "my-mod-messages" {
                    "hello" = "Hello!",
                }
            }
        }
    "#;

    let module = parse_module(source, "settings").unwrap();
    assert_eq!(
        module.locales,
        vec![LocaleFile {
            lang: "en".to_string(),
            file: "settings".to_string(),
            entries: vec![
                LocaleEntry {
                    category: Some("mod-setting-name".to_string()),
                    key: "msr-casual-mode".to_string(),
                    value: "Casual mode".to_string(),
                },
                LocaleEntry {
                    category: Some("my-mod-messages".to_string()),
                    key: "hello".to_string(),
                    value: "Hello!".to_string(),
                },
            ],
        }]
    );
}

#[test]
fn locale_file_serializes_factorio_cfg() {
    let file = LocaleFile {
        lang: "en".to_string(),
        file: "settings".to_string(),
        entries: vec![
            LocaleEntry {
                category: Some("mod-setting-name".to_string()),
                key: "msr-casual-mode".to_string(),
                value: "Casual mode".to_string(),
            },
            LocaleEntry {
                category: Some("mod-setting-description".to_string()),
                key: "msr-casual-mode".to_string(),
                value: "Relax rules.".to_string(),
            },
        ],
    };

    assert_eq!(
        file.to_cfg(),
        "[mod-setting-name]\n\
         msr-casual-mode=Casual mode\n\
         \n\
         [mod-setting-description]\n\
         msr-casual-mode=Relax rules.\n"
    );
}

#[test]
fn locale_macro_multiple_languages() {
    let source = r#"
        factorio_rs::mod_settings! {
            prefix = "msr",
            startup {
                casual_mode: bool = false,
            }
        }

        factorio_rs::locale! {
            file = "settings",
            en {
                mod_setting_name {
                    Settings::CASUAL_MODE = "Casual mode",
                }
            }
            de {
                mod_setting_name {
                    Settings::CASUAL_MODE = "Entspannter Modus",
                }
            }
        }
    "#;

    let module = parse_module(source, "settings").unwrap();
    assert_eq!(module.locales.len(), 2);
    assert_eq!(module.locales[0].lang, "en");
    assert_eq!(module.locales[1].lang, "de");
    assert_eq!(module.locales[1].entries[0].value, "Entspannter Modus");
}