Compare commits

..

1 commit

Author SHA1 Message Date
62bac7763c
chore(deps): update rust crate steamlocate to v2.0.1
All checks were successful
lint/clippy Checking for common mistakes and opportunities for code improvement
build/linux Build for the target platform: linux
build/msvc Build for the target platform: msvc
2025-04-21 16:46:08 +00:00
14 changed files with 50 additions and 47 deletions

View file

@ -10,6 +10,6 @@ title "Install clippy"
rustup component add clippy rustup component add clippy
title "Run clippy" title "Run clippy"
cargo clippy --color always --no-deps -- -D warnings cargo clippy --color always --no-deps
title "Done" title "Done"

3
.gitmodules vendored
View file

@ -1,3 +1,6 @@
[submodule "lib/serde_sjson"]
path = lib/serde_sjson
url = https://git.sclu1034.dev/lucas/serde_sjson.git
[submodule "lib/luajit2-sys"] [submodule "lib/luajit2-sys"]
path = lib/luajit2-sys path = lib/luajit2-sys
url = https://github.com/sclu1034/luajit2-sys.git url = https://github.com/sclu1034/luajit2-sys.git

27
Cargo.lock generated
View file

@ -39,7 +39,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c43e7fd8284f025d0bd143c2855618ecdf697db55bde39211e5c9faec7669173" checksum = "c43e7fd8284f025d0bd143c2855618ecdf697db55bde39211e5c9faec7669173"
dependencies = [ dependencies = [
"heapless", "heapless",
"nom 7.1.3", "nom",
] ]
[[package]] [[package]]
@ -383,7 +383,7 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
dependencies = [ dependencies = [
"nom 7.1.3", "nom",
] ]
[[package]] [[package]]
@ -2273,24 +2273,15 @@ dependencies = [
"minimal-lexical", "minimal-lexical",
] ]
[[package]]
name = "nom"
version = "8.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "nom_locate" name = "nom_locate"
version = "5.0.0" version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b577e2d69827c4740cba2b52efaad1c4cc7c73042860b199710b3575c68438d" checksum = "1e3c83c053b0713da60c5b8de47fe8e494fe3ece5267b2f23090a07a053ba8f3"
dependencies = [ dependencies = [
"bytecount", "bytecount",
"memchr", "memchr",
"nom 8.0.0", "nom",
] ]
[[package]] [[package]]
@ -3278,11 +3269,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_sjson" name = "serde_sjson"
version = "1.2.1" version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c5b0d7af37492e99b8559436ee76b9ec8935c75449b1c2ef08c205a9e92ae6f"
dependencies = [ dependencies = [
"nom 8.0.0", "nom",
"nom_locate", "nom_locate",
"serde", "serde",
] ]
@ -4385,7 +4374,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [ dependencies = [
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]

View file

@ -6,6 +6,7 @@ members = [
"lib/dtmt-shared", "lib/dtmt-shared",
"lib/oodle", "lib/oodle",
"lib/sdk", "lib/sdk",
"lib/serde_sjson",
"lib/luajit2-sys", "lib/luajit2-sys",
"lib/color-eyre", "lib/color-eyre",
] ]
@ -34,7 +35,7 @@ glob = "0.3.0"
interprocess = "2.1.0" interprocess = "2.1.0"
lazy_static = "1.4.0" lazy_static = "1.4.0"
luajit2-sys = { path = "lib/luajit2-sys" } luajit2-sys = { path = "lib/luajit2-sys" }
minijinja = { version = "2.0.1", default-features = false, features = ["serde"] } minijinja = { version = "2.0.1", default-features = false }
nanorand = "0.7.0" nanorand = "0.7.0"
nexusmods = { path = "lib/nexusmods" } nexusmods = { path = "lib/nexusmods" }
notify = "8.0.0" notify = "8.0.0"
@ -46,7 +47,7 @@ pin-project-lite = "0.2.9"
promptly = "0.3.1" promptly = "0.3.1"
sdk = { path = "lib/sdk" } sdk = { path = "lib/sdk" }
serde = { version = "1.0.152", features = ["derive", "rc"] } serde = { version = "1.0.152", features = ["derive", "rc"] }
serde_sjson = "1.2.1" serde_sjson = { path = "lib/serde_sjson" }
steamlocate = "2.0.0-beta.2" steamlocate = "2.0.0-beta.2"
strip-ansi-escapes = "0.2.0" strip-ansi-escapes = "0.2.0"
time = { version = "0.3.20", features = ["serde", "serde-well-known", "local-offset", "formatting", "macros"] } time = { version = "0.3.20", features = ["serde", "serde-well-known", "local-offset", "formatting", "macros"] }

View file

@ -116,14 +116,14 @@ async fn patch_game_settings(state: Arc<ActionState>) -> Result<()> {
eyre::bail!("couldn't find 'boot_script' field"); eyre::bail!("couldn't find 'boot_script' field");
}; };
f.write_all(&settings.as_bytes()[0..i]).await?; f.write_all(settings[0..i].as_bytes()).await?;
f.write_all(b"boot_script = \"scripts/mod_main\"").await?; f.write_all(b"boot_script = \"scripts/mod_main\"").await?;
let Some(j) = settings[i..].find('\n') else { let Some(j) = settings[i..].find('\n') else {
eyre::bail!("couldn't find end of 'boot_script' field"); eyre::bail!("couldn't find end of 'boot_script' field");
}; };
f.write_all(&settings.as_bytes()[(i + j)..]).await?; f.write_all(settings[(i + j)..].as_bytes()).await?;
Ok(()) Ok(())
} }
@ -453,7 +453,10 @@ async fn build_bundles(state: Arc<ActionState>) -> Result<Vec<Bundle>> {
} }
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
async fn patch_boot_bundle(state: Arc<ActionState>, deployment_info: &str) -> Result<Vec<Bundle>> { async fn patch_boot_bundle(
state: Arc<ActionState>,
deployment_info: &String,
) -> Result<Vec<Bundle>> {
let bundle_dir = Arc::new(state.game_dir.join("bundle")); let bundle_dir = Arc::new(state.game_dir.join("bundle"));
let bundle_path = bundle_dir.join(format!("{:x}", Murmur64::hash(BOOT_BUNDLE_NAME.as_bytes()))); let bundle_path = bundle_dir.join(format!("{:x}", Murmur64::hash(BOOT_BUNDLE_NAME.as_bytes())));
@ -587,7 +590,11 @@ fn build_deployment_data(
.map(|bundle| format!("{:x}", bundle.name().to_murmur64())) .map(|bundle| format!("{:x}", bundle.name().to_murmur64()))
.collect(), .collect(),
// TODO: // TODO:
mod_folders: mod_folders.as_ref().to_vec(), mod_folders: mod_folders
.as_ref()
.iter()
.map(|folder| folder.clone())
.collect(),
}; };
serde_sjson::to_string(&info).wrap_err("Failed to serizalize deployment data") serde_sjson::to_string(&info).wrap_err("Failed to serizalize deployment data")
} }

View file

@ -91,14 +91,14 @@ async fn patch_game_settings(state: Arc<ActionState>) -> Result<()> {
eyre::bail!("couldn't find 'boot_script' field"); eyre::bail!("couldn't find 'boot_script' field");
}; };
f.write_all(&settings.as_bytes()[0..i]).await?; f.write_all(settings[0..i].as_bytes()).await?;
f.write_all(b"boot_script = \"scripts/mod_main\"").await?; f.write_all(b"boot_script = \"scripts/mod_main\"").await?;
let Some(j) = settings[i..].find('\n') else { let Some(j) = settings[i..].find('\n') else {
eyre::bail!("couldn't find end of 'boot_script' field"); eyre::bail!("couldn't find end of 'boot_script' field");
}; };
f.write_all(&settings.as_bytes()[(i + j)..]).await?; f.write_all(settings[(i + j)..].as_bytes()).await?;
Ok(()) Ok(())
} }
@ -208,7 +208,7 @@ pub(crate) async fn reset_mod_deployment(state: ActionState) -> Result<()> {
for p in paths { for p in paths {
let path = bundle_dir.join(p); let path = bundle_dir.join(p);
let backup = bundle_dir.join(format!("{}.bak", p)); let backup = bundle_dir.join(&format!("{}.bak", p));
let res = async { let res = async {
tracing::debug!( tracing::debug!(

View file

@ -397,7 +397,7 @@ fn extract_legacy_mod<R: Read + Seek>(
tracing::trace!("Writing file '{}'", name.display()); tracing::trace!("Writing file '{}'", name.display());
let mut out = std::fs::OpenOptions::new() let mut out = std::fs::OpenOptions::new()
.write(true) .write(true)
.truncate(true) .create(true)
.open(&name) .open(&name)
.wrap_err_with(|| format!("Failed to open file '{}'", name.display()))?; .wrap_err_with(|| format!("Failed to open file '{}'", name.display()))?;

View file

@ -150,7 +150,7 @@ async fn parse_command_line_template(tmpl: &String) -> Result<CmdLine> {
String::from_utf8_unchecked(bytes.to_vec()) String::from_utf8_unchecked(bytes.to_vec())
}); });
for arg in parsed.by_ref() { while let Some(arg) = parsed.next() {
// Safety: See above. // Safety: See above.
cmd.arg(unsafe { String::from_utf8_unchecked(arg.to_vec()) }); cmd.arg(unsafe { String::from_utf8_unchecked(arg.to_vec()) });
} }

View file

@ -54,11 +54,17 @@ impl<'a> ShellParser<'a> {
} }
_ => {} _ => {}
}, },
ParserState::SingleQuote => if c == b'\'' { ParserState::SingleQuote => match c {
b'\'' => {
return Some(&self.bytes[start..(self.offset - 1)]); return Some(&self.bytes[start..(self.offset - 1)]);
}
_ => {}
}, },
ParserState::DoubleQuote => if c == b'"' { ParserState::DoubleQuote => match c {
b'"' => {
return Some(&self.bytes[start..(self.offset - 1)]); return Some(&self.bytes[start..(self.offset - 1)]);
}
_ => {}
}, },
} }
} }

View file

@ -237,7 +237,7 @@ impl Bundle {
// Ceiling division (or division toward infinity) to calculate // Ceiling division (or division toward infinity) to calculate
// the number of chunks required to fit the unpacked data. // the number of chunks required to fit the unpacked data.
let num_chunks = unpacked_data.len().div_ceil(CHUNK_SIZE); let num_chunks = (unpacked_data.len() + CHUNK_SIZE - 1) / CHUNK_SIZE;
tracing::trace!(num_chunks); tracing::trace!(num_chunks);
w.write_u32(num_chunks as u32)?; w.write_u32(num_chunks as u32)?;

View file

@ -125,7 +125,7 @@ pub fn compile(name: impl Into<IdString64>, code: impl AsRef<str>) -> Result<Bun
tracing::trace!( tracing::trace!(
"Compiling '{}', {} bytes of code", "Compiling '{}', {} bytes of code",
name.display(), name.display(),
code.len() code.as_bytes().len()
); );
let bytecode = unsafe { let bytecode = unsafe {
@ -156,10 +156,10 @@ pub fn compile(name: impl Into<IdString64>, code: impl AsRef<str>) -> Result<Bun
} }
_ => unreachable!(), _ => unreachable!(),
} }
lua::lua_setglobal(state, c"fn".as_ptr()); lua::lua_setglobal(state, b"fn\0".as_ptr() as _);
let run = c"return string.dump(fn, false)"; let run = b"return string.dump(fn, false)\0";
match lua::luaL_loadstring(state, run.as_ptr()) as u32 { match lua::luaL_loadstring(state, run.as_ptr() as _) as u32 {
lua::LUA_OK => {} lua::LUA_OK => {}
lua::LUA_ERRSYNTAX => { lua::LUA_ERRSYNTAX => {
let err = lua::lua_tostring(state, -1); let err = lua::lua_tostring(state, -1);

View file

@ -28,14 +28,10 @@ impl Language {
#[derive(serde::Serialize)] #[derive(serde::Serialize)]
pub struct Strings(HashMap<String, HashMap<Language, String>>); pub struct Strings(HashMap<String, HashMap<Language, String>>);
#[inline(always)]
fn read_string<R>(r: R) -> Result<String> fn read_string<R>(r: R) -> Result<String>
where where
R: Read, R: Read,
{ {
// We can safely ignore the warning here, as all data is already in memory, and no additional
// `BufReader` should be needed.
#[allow(clippy::unbuffered_bytes)]
r.bytes() r.bytes()
.take_while(|b| b.as_ref().map(|b| *b != 0).unwrap_or(false)) .take_while(|b| b.as_ref().map(|b| *b != 0).unwrap_or(false))
.map(|b| b.map_err(Report::new)) .map(|b| b.map_err(Report::new))
@ -45,7 +41,7 @@ where
impl Strings { impl Strings {
#[tracing::instrument(skip_all, fields(languages = variants.len()))] #[tracing::instrument(skip_all, fields(languages = variants.len()))]
pub fn from_variants(ctx: &crate::Context, variants: &[BundleFileVariant]) -> Result<Self> { pub fn from_variants(ctx: &crate::Context, variants: &Vec<BundleFileVariant>) -> Result<Self> {
let mut map: HashMap<String, HashMap<Language, String>> = HashMap::new(); let mut map: HashMap<String, HashMap<Language, String>> = HashMap::new();
for (i, variant) in variants.iter().enumerate() { for (i, variant) in variants.iter().enumerate() {
@ -80,7 +76,7 @@ impl Strings {
} }
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
pub fn decompile(ctx: &crate::Context, variants: &[BundleFileVariant]) -> Result<Vec<UserFile>> { pub fn decompile(ctx: &crate::Context, variants: &Vec<BundleFileVariant>) -> Result<Vec<UserFile>> {
let strings = Strings::from_variants(ctx, variants)?; let strings = Strings::from_variants(ctx, variants)?;
let content = strings.to_sjson()?; let content = strings.to_sjson()?;

1
lib/serde_sjson Submodule

@ -0,0 +1 @@
Subproject commit 73d2b23ce50e75b184f5092ad515e97a0adbe6da