refactor(vm): fix Reagent code gen
Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
This commit is contained in:
70
Cargo.lock
generated
70
Cargo.lock
generated
@@ -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",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"rust-analyzer.cargo.features": [
|
"rust-analyzer.cargo.features": [
|
||||||
"tsify"
|
"tsify",
|
||||||
|
"prefab_database"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}\
|
||||||
"
|
"
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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: ®ex::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()
|
||||||
|
|||||||
@@ -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<()> {
|
||||||
|
|||||||
@@ -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>>,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user