refactor(vm): fix Reagent code gen

Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
This commit is contained in:
Rachel Powers
2024-09-16 18:01:45 -07:00
parent 08c42a2618
commit 6e80f21046
6 changed files with 199 additions and 92 deletions

70
Cargo.lock generated
View File

@@ -119,7 +119,7 @@ checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -130,7 +130,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -260,7 +260,7 @@ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -354,7 +354,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim 0.10.0", "strsim 0.10.0",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -365,7 +365,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f"
dependencies = [ dependencies = [
"darling_core", "darling_core",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -484,7 +484,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -636,6 +636,7 @@ dependencies = [
"strum_macros", "strum_macros",
"thiserror", "thiserror",
"time", "time",
"tracing",
"tsify", "tsify",
"wasm-bindgen", "wasm-bindgen",
] ]
@@ -658,6 +659,7 @@ dependencies = [
"serde_with", "serde_with",
"stationeers_data", "stationeers_data",
"thiserror", "thiserror",
"tracing-wasm",
"tsify", "tsify",
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures", "wasm-bindgen-futures",
@@ -1078,7 +1080,7 @@ dependencies = [
"phf_shared 0.11.2", "phf_shared 0.11.2",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1116,7 +1118,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1150,7 +1152,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1161,18 +1163,18 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.82" version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.36" version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@@ -1308,7 +1310,7 @@ checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1319,7 +1321,7 @@ checksum = "e578a843d40b4189a4d66bba51d7684f57da5bd7c304c64e14bd63efbef49509"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1360,7 +1362,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1390,7 +1392,7 @@ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1446,6 +1448,7 @@ dependencies = [
name = "stationeers_data" name = "stationeers_data"
version = "0.2.3" version = "0.2.3"
dependencies = [ dependencies = [
"const-crc32",
"num-integer", "num-integer",
"phf 0.11.2", "phf 0.11.2",
"serde", "serde",
@@ -1488,7 +1491,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"rustversion", "rustversion",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1504,9 +1507,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.64" version = "2.0.77"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ad3dee41f36859875573074334c200d1add8e4a87bb37113ebd31d926b7b11f" checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1536,7 +1539,7 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1625,7 +1628,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1694,7 +1697,7 @@ checksum = "84fd902d4e0b9a4b27f2f440108dc034e1758628a9b702f8ec61ad66355422fa"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1722,7 +1725,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1756,6 +1759,17 @@ dependencies = [
"tracing-core", "tracing-core",
] ]
[[package]]
name = "tracing-wasm"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07"
dependencies = [
"tracing",
"tracing-subscriber",
"wasm-bindgen",
]
[[package]] [[package]]
name = "tree-sitter" name = "tree-sitter"
version = "0.20.10" version = "0.20.10"
@@ -1820,7 +1834,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"serde_derive_internals", "serde_derive_internals",
"syn 2.0.64", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1911,7 +1925,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@@ -1946,7 +1960,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.64", "syn 2.0.77",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@@ -2150,7 +2164,7 @@ dependencies = [
"serde_path_to_error", "serde_path_to_error",
"serde_with", "serde_with",
"stationeers_data", "stationeers_data",
"syn 2.0.64", "syn 2.0.77",
"textwrap", "textwrap",
"thiserror", "thiserror",
"tracing", "tracing",

View File

@@ -1,5 +1,6 @@
{ {
"rust-analyzer.cargo.features": [ "rust-analyzer.cargo.features": [
"tsify" "tsify",
"prefab_database"
] ]
} }

View File

@@ -1,4 +1,4 @@
use color_eyre::eyre; use color_eyre::eyre::{self, Context};
use quote::ToTokens; use quote::ToTokens;
use std::collections::BTreeMap; use std::collections::BTreeMap;
@@ -98,16 +98,22 @@ fn format_rust(content: impl ToTokens) -> color_eyre::Result<String> {
Ok(prettyplease::unparse(&content)) Ok(prettyplease::unparse(&content))
} }
fn prepend_generated_comment_and_format(file_path: &std::path::Path, module: &str) -> color_eyre::Result<()> { fn prepend_generated_comment_and_format(
file_path: &std::path::Path,
module: &str,
) -> color_eyre::Result<()> {
use std::io::Write; use std::io::Write;
let tmp_path = file_path.with_extension("rs.tmp"); let tmp_path = file_path.with_extension("rs.tmp");
{ {
let mut tmp = std::fs::File::create(&tmp_path)?; let mut tmp = std::fs::File::create(&tmp_path)?;
let src = syn::parse_file(&std::fs::read_to_string(file_path)?)?; let src = syn::parse_file(&std::fs::read_to_string(file_path)?)
.with_context(|| format!("Error parsing file {}", file_path.display()))?;
let formated = format_rust(src)?; let formatted = format_rust(src)?;
write!(&mut tmp, "\ write!(
&mut tmp,
"\
// =================================================\n\ // =================================================\n\
// !! <-----> DO NOT MODIFY <-----> !!\n\ // !! <-----> DO NOT MODIFY <-----> !!\n\
//\n\ //\n\
@@ -122,7 +128,7 @@ fn prepend_generated_comment_and_format(file_path: &std::path::Path, module: &st
//\n\ //\n\
// =================================================\n\ // =================================================\n\
\n\ \n\
{formated}\ {formatted}\
" "
)?; )?;
} }

View File

@@ -19,11 +19,11 @@ use stationeers_data::templates::{
InstructionPartType, InternalAtmoInfo, ItemCircuitHolderTemplate, ItemConsumerTemplate, InstructionPartType, InternalAtmoInfo, ItemCircuitHolderTemplate, ItemConsumerTemplate,
ItemInfo, ItemLogicMemoryTemplate, ItemLogicTemplate, ItemSlotsTemplate, ItemInfo, ItemLogicMemoryTemplate, ItemLogicTemplate, ItemSlotsTemplate,
ItemSuitCircuitHolderTemplate, ItemSuitLogicTemplate, ItemSuitTemplate, ItemTemplate, ItemSuitCircuitHolderTemplate, ItemSuitLogicTemplate, ItemSuitTemplate, ItemTemplate,
LogicInfo, MemoryInfo, ObjectTemplate, PrefabInfo, Recipe, RecipeGasMix, RecipeRange, SlotInfo, LogicInfo, MemoryInfo, ObjectTemplate, PrefabInfo, Reagent, Recipe, RecipeGasMix, RecipeRange,
StructureCircuitHolderTemplate, StructureInfo, StructureLogicDeviceConsumerMemoryTemplate, SlotInfo, StructureCircuitHolderTemplate, StructureInfo,
StructureLogicDeviceConsumerTemplate, StructureLogicDeviceMemoryTemplate, StructureLogicDeviceConsumerMemoryTemplate, StructureLogicDeviceConsumerTemplate,
StructureLogicDeviceTemplate, StructureLogicTemplate, StructureSlotsTemplate, StructureLogicDeviceMemoryTemplate, StructureLogicDeviceTemplate, StructureLogicTemplate,
StructureTemplate, SuitInfo, ThermalInfo, StructureSlotsTemplate, StructureTemplate, SuitInfo, ThermalInfo,
}; };
#[allow(clippy::too_many_lines)] #[allow(clippy::too_many_lines)]
@@ -174,9 +174,21 @@ pub fn generate_database(
} }
}) })
.collect(); .collect();
let reagents = stationpedia
.reagents
.iter()
.map(|(name, reagent)| {
(
name.clone(),
Into::<Reagent>::into(reagent).with_name(name.clone()),
)
})
.collect();
let db: ObjectDatabase = ObjectDatabase { let db: ObjectDatabase = ObjectDatabase {
prefabs, prefabs,
reagents: stationpedia.reagents.clone(), reagents,
enums: enums.clone(), enums: enums.clone(),
prefabs_by_hash, prefabs_by_hash,
structures, structures,
@@ -191,7 +203,7 @@ pub fn generate_database(
.join("www") .join("www")
.join("src") .join("src")
.join("ts") .join("ts")
.join("virtualMachine"); .join("database");
if !data_path.exists() { if !data_path.exists() {
std::fs::create_dir(&data_path)?; std::fs::create_dir(&data_path)?;
} }
@@ -225,7 +237,15 @@ pub fn generate_database(
let mut prefab_map_file = std::io::BufWriter::new(std::fs::File::create(&prefab_map_path)?); let mut prefab_map_file = std::io::BufWriter::new(std::fs::File::create(&prefab_map_path)?);
write_prefab_map(&mut prefab_map_file, &db.prefabs)?; write_prefab_map(&mut prefab_map_file, &db.prefabs)?;
Ok(vec![prefab_map_path]) let reagent_map_path = workspace
.join("stationeers_data")
.join("src")
.join("database")
.join("reagent_map.rs");
let mut reagent_map_file = std::io::BufWriter::new(std::fs::File::create(&reagent_map_path)?);
write_reagent_map(&mut reagent_map_file, &db.reagents)?;
Ok(vec![prefab_map_path, reagent_map_path])
} }
fn write_prefab_map<T: std::io::Write>( fn write_prefab_map<T: std::io::Write>(
@@ -243,12 +263,17 @@ fn write_prefab_map<T: std::io::Write>(
} }
)?; )?;
let enum_tag_regex = regex::Regex::new(r#"templateType:\s"\w+"\.into\(\),"#).unwrap(); let enum_tag_regex = regex::Regex::new(r#"templateType:\s"\w+"\.into\(\),"#).unwrap();
let numeric_string_literal_regex = regex::Regex::new(r#""(\d+)"\.into\(\)"#).unwrap();
let entries = prefabs let entries = prefabs
.values() .values()
.map(|prefab| { .map(|prefab| {
let hash = prefab.prefab().prefab_hash; let hash = prefab.prefab().prefab_hash;
let uneval_src = &uneval::to_string(prefab)?; let uneval_src = &uneval::to_string(prefab)?;
let obj = syn::parse_str::<syn::Expr>(&enum_tag_regex.replace_all(&uneval_src, ""))?; let fixed = enum_tag_regex.replace_all(&uneval_src, "");
let fixed = numeric_string_literal_regex.replace_all(&fixed, |captures: &regex::Captures| {
captures[1].to_string()
});
let obj = syn::parse_str::<syn::Expr>(&fixed)?;
let entry = quote! { let entry = quote! {
map.insert(#hash, #obj.into()); map.insert(#hash, #obj.into());
}; };
@@ -270,9 +295,47 @@ fn write_prefab_map<T: std::io::Write>(
Ok(()) Ok(())
} }
fn write_reagent_map<T: std::io::Write>(
writer: &mut BufWriter<T>,
reagents: &BTreeMap<String, Reagent>,
) -> color_eyre::Result<()> {
write!(
writer,
"{}",
quote! {
use crate::templates::Reagent;
}
)?;
let entries = reagents
.values()
.map(|reagent| {
let id = reagent.id;
let uneval_src = &uneval::to_string(reagent)?;
let obj = syn::parse_str::<syn::Expr>(&uneval_src)?;
let entry = quote! {
map.insert(#id, #obj);
};
Ok(entry)
})
.collect::<Result<Vec<_>, color_eyre::Report>>()?;
write!(
writer,
"{}",
quote! {
pub fn build_reagent_database() -> std::collections::BTreeMap<u8, crate::templates::Reagent> {
#[allow(clippy::unreadable_literal)]
let mut map: std::collections::BTreeMap<u8, crate::templates::Reagent> = std::collections::BTreeMap::new();
#(#entries)*
map
}
},
)?;
Ok(())
}
#[allow(clippy::too_many_lines)] #[allow(clippy::too_many_lines)]
fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> { fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
println!("Generating templates ..."); eprintln!("Generating templates ...");
let mut templates: Vec<ObjectTemplate> = Vec::new(); let mut templates: Vec<ObjectTemplate> = Vec::new();
for page in &pedia.pages { for page in &pedia.pages {
let prefab = PrefabInfo { let prefab = PrefabInfo {
@@ -567,7 +630,6 @@ fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
thermal_info: thermal.as_ref().map(Into::into), thermal_info: thermal.as_ref().map(Into::into),
internal_atmo_info: internal_atmosphere.as_ref().map(Into::into), internal_atmo_info: internal_atmosphere.as_ref().map(Into::into),
})); }));
// println!("Structure")
} }
Page { Page {
item: None, item: None,
@@ -591,7 +653,6 @@ fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
internal_atmo_info: internal_atmosphere.as_ref().map(Into::into), internal_atmo_info: internal_atmosphere.as_ref().map(Into::into),
slots: slot_inserts_to_info(slot_inserts), slots: slot_inserts_to_info(slot_inserts),
})); }));
// println!("Structure")
} }
Page { Page {
item: None, item: None,
@@ -624,7 +685,6 @@ fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
logic, logic,
slots: slot_inserts_to_info(slot_inserts), slots: slot_inserts_to_info(slot_inserts),
})); }));
// println!("Structure")
} }
Page { Page {
item: None, item: None,
@@ -660,7 +720,6 @@ fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
device: device.into(), device: device.into(),
}, },
)); ));
// println!("Structure")
} }
Page { Page {
item: None, item: None,
@@ -704,7 +763,6 @@ fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
device: device.into(), device: device.into(),
}, },
)); ));
// println!("Structure")
} }
Page { Page {
item: None, item: None,
@@ -742,7 +800,6 @@ fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
fabricator_info: device.fabricator.as_ref().map(Into::into), fabricator_info: device.fabricator.as_ref().map(Into::into),
}, },
)); ));
// println!("Structure")
} }
Page { Page {
item: None, item: None,
@@ -778,7 +835,6 @@ fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
memory: memory.into(), memory: memory.into(),
}, },
)); ));
// println!("Structure")
} }
Page { Page {
item: None, item: None,
@@ -816,7 +872,6 @@ fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
memory: memory.into(), memory: memory.into(),
}, },
)); ));
// println!("Structure")
} }
_ => panic!( _ => panic!(
"\ "\
@@ -851,16 +906,32 @@ fn generate_templates(pedia: &Stationpedia) -> Vec<ObjectTemplate> {
templates templates
} }
fn slot_inserts_to_info(slots: &[stationpedia::SlotInsert]) -> Vec<SlotInfo> { fn slot_inserts_to_info(slots: &[stationpedia::SlotInsert]) -> BTreeMap<u32, SlotInfo> {
let mut tmp: Vec<_> = slots.into(); let mut tmp: Vec<_> = slots.into();
tmp.sort_by(|a, b| a.slot_index.cmp(&b.slot_index)); tmp.sort_by(|a, b| a.slot_index.cmp(&b.slot_index));
tmp.iter() tmp.iter()
.map(|slot| SlotInfo { .map(|slot| {
name: slot.slot_name.clone(), let typ = &slot.slot_type;
typ: slot if typ == "Proxy" {
.slot_type (
.parse() slot.slot_index,
.unwrap_or_else(|err| panic!("failed to parse slot class: {err}")), SlotInfo::Proxy {
name: slot.slot_name.clone(),
index: slot.slot_index,
},
)
} else {
(
slot.slot_index,
SlotInfo::Direct {
name: slot.slot_name.clone(),
class: typ.parse().unwrap_or_else(|err| {
panic!("failed to parse slot class '{typ}': {err}")
}),
index: slot.slot_index,
},
)
}
}) })
.collect() .collect()
} }
@@ -877,7 +948,7 @@ fn mode_inserts_to_info(modes: &[stationpedia::ModeInsert]) -> BTreeMap<u32, Str
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct ObjectDatabase { pub struct ObjectDatabase {
pub prefabs: BTreeMap<String, ObjectTemplate>, pub prefabs: BTreeMap<String, ObjectTemplate>,
pub reagents: BTreeMap<String, stationpedia::Reagent>, pub reagents: BTreeMap<String, Reagent>,
pub enums: enums::Enums, pub enums: enums::Enums,
pub prefabs_by_hash: BTreeMap<i32, String>, pub prefabs_by_hash: BTreeMap<i32, String>,
pub structures: Vec<String>, pub structures: Vec<String>,
@@ -929,10 +1000,10 @@ impl From<&stationpedia::LogicInfo> for LogicInfo {
.map(|(key, val)| { .map(|(key, val)| {
( (
key.parse().unwrap_or_else(|err| { key.parse().unwrap_or_else(|err| {
panic!("failed to parse logic slot type: {err}") panic!("failed to parse logic slot type '{key}': {err}")
}), }),
val.parse().unwrap_or_else(|err| { val.parse().unwrap_or_else(|err| {
panic!("failed to parse memory access: {err}") panic!("failed to parse memory access '{val}': {err}")
}), }),
) )
}) })
@@ -946,10 +1017,12 @@ impl From<&stationpedia::LogicInfo> for LogicInfo {
.iter() .iter()
.map(|(key, val)| { .map(|(key, val)| {
( (
key.parse() key.parse().unwrap_or_else(|err| {
.unwrap_or_else(|err| panic!("failed to parse logic type: {err}")), panic!("failed to parse logic type '{key}' : {err}")
val.parse() }),
.unwrap_or_else(|err| panic!("failed to parse memory access: {err}")), val.parse().unwrap_or_else(|err| {
panic!("failed to parse memory access '{val}': {err}")
}),
) )
}) })
.collect(), .collect(),
@@ -976,20 +1049,14 @@ impl From<&stationpedia::Item> for ItemInfo {
.reagents .reagents
.as_ref() .as_ref()
.map(|map| map.iter().map(|(key, val)| (key.clone(), *val)).collect()), .map(|map| map.iter().map(|(key, val)| (key.clone(), *val)).collect()),
slot_class: item slot_class: item.slot_class.parse().unwrap_or_else(|err| {
.slot_class let slot_class = &item.slot_class;
.parse() panic!("failed to parse slot class `{slot_class}`: {err}");
.unwrap_or_else(|err| { }),
let slot_class = &item.slot_class; sorting_class: item.sorting_class.parse().unwrap_or_else(|err| {
panic!("failed to parse slot class `{slot_class}`: {err}"); let sorting_class = &item.sorting_class;
}), panic!("failed to parse sorting class `{sorting_class}`: {err}");
sorting_class: item }),
.sorting_class
.parse()
.unwrap_or_else(|err| {
let sorting_class = &item.sorting_class;
panic!("failed to parse sorting class `{sorting_class}`: {err}");
}),
} }
} }
} }
@@ -1001,12 +1068,12 @@ impl From<&stationpedia::Device> for DeviceInfo {
.connection_list .connection_list
.iter() .iter()
.map(|(typ, role)| ConnectionInfo { .map(|(typ, role)| ConnectionInfo {
typ: typ typ: typ.parse().unwrap_or_else(|err| {
.parse() panic!("failed to parse connection type `{typ}`: {err}")
.unwrap_or_else(|err| panic!("failed to parse connection type `{typ}`: {err}")), }),
role: role role: role.parse().unwrap_or_else(|err| {
.parse() panic!("failed to parse connection role `{role}`: {err}")
.unwrap_or_else(|err| panic!("failed to parse connection role `{role}`: {err}")), }),
}) })
.collect(), .collect(),
device_pins_length: value.devices_length, device_pins_length: value.devices_length,
@@ -1123,6 +1190,19 @@ impl From<&stationpedia::ResourceConsumer> for ConsumerInfo {
} }
} }
impl From<&stationpedia::Reagent> for Reagent {
fn from(value: &stationpedia::Reagent) -> Self {
Reagent {
id: value.id,
name: String::new(),
hash: value.hash,
unit: value.unit.clone(),
is_organic: value.is_organic,
sources: value.sources.clone().unwrap_or_default(),
}
}
}
impl From<&stationpedia::Fabricator> for FabricatorInfo { impl From<&stationpedia::Fabricator> for FabricatorInfo {
fn from(value: &stationpedia::Fabricator) -> Self { fn from(value: &stationpedia::Fabricator) -> Self {
FabricatorInfo { FabricatorInfo {
@@ -1133,7 +1213,7 @@ impl From<&stationpedia::Fabricator> for FabricatorInfo {
recipes: value recipes: value
.recipes .recipes
.iter() .iter()
.map(|(key, val)| (key.clone(), val.into())) .map(|(prefab, val)| Into::<Recipe>::into(val).with_target(prefab))
.collect(), .collect(),
} }
} }
@@ -1142,6 +1222,8 @@ impl From<&stationpedia::Fabricator> for FabricatorInfo {
impl From<&stationpedia::Recipe> for Recipe { impl From<&stationpedia::Recipe> for Recipe {
fn from(value: &stationpedia::Recipe) -> Self { fn from(value: &stationpedia::Recipe) -> Self {
Recipe { Recipe {
target_prefab: String::new(),
target_prefab_hash: 0,
tier: value tier: value
.tier_name .tier_name
.parse() .parse()

View File

@@ -15,7 +15,7 @@ pub fn generate(
enums: &crate::enums::Enums, enums: &crate::enums::Enums,
workspace: &std::path::Path, workspace: &std::path::Path,
) -> color_eyre::Result<Vec<PathBuf>> { ) -> color_eyre::Result<Vec<PathBuf>> {
println!("Writing Enum Listings ..."); eprintln!("Writing Enum Listings ...");
let enums_path = workspace.join("stationeers_data").join("src").join("enums"); let enums_path = workspace.join("stationeers_data").join("src").join("enums");
if !enums_path.exists() { if !enums_path.exists() {
std::fs::create_dir(&enums_path)?; std::fs::create_dir(&enums_path)?;
@@ -51,7 +51,7 @@ pub fn generate(
} }
write_enum_listing(&mut writer, enm)?; write_enum_listing(&mut writer, enm)?;
} }
write_enum_aggragate_mod(&mut writer, &enums.basic_enums)?; write_enum_aggregate_mod(&mut writer, &enums.basic_enums)?;
let mut writer = std::io::BufWriter::new(std::fs::File::create(enums_path.join("prefabs.rs"))?); let mut writer = std::io::BufWriter::new(std::fs::File::create(enums_path.join("prefabs.rs"))?);
write_repr_enum_use_header(&mut writer)?; write_repr_enum_use_header(&mut writer)?;
@@ -80,7 +80,7 @@ pub fn generate(
} }
#[allow(clippy::type_complexity)] #[allow(clippy::type_complexity)]
fn write_enum_aggragate_mod<T: std::io::Write>( fn write_enum_aggregate_mod<T: std::io::Write>(
writer: &mut BufWriter<T>, writer: &mut BufWriter<T>,
enums: &BTreeMap<String, crate::enums::EnumListing>, enums: &BTreeMap<String, crate::enums::EnumListing>,
) -> color_eyre::Result<()> { ) -> color_eyre::Result<()> {

View File

@@ -30,10 +30,14 @@ impl Stationpedia {
#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
pub struct Reagent { pub struct Reagent {
#[serde(rename = "Id")]
pub id: u8,
#[serde(rename = "Hash")] #[serde(rename = "Hash")]
pub hash: i64, pub hash: i32,
#[serde(rename = "Unit")] #[serde(rename = "Unit")]
pub unit: String, pub unit: String,
#[serde(rename = "IsOrganic")]
pub is_organic: bool,
#[serde(rename = "Sources")] #[serde(rename = "Sources")]
pub sources: Option<BTreeMap<String, f64>>, pub sources: Option<BTreeMap<String, f64>>,
} }