dtmt/lib/sdk/src/context.rs
Lucas Schwiderski d0fefee667
dtmt: Optimize dictionary creation
Improve the way the dictionary can read and write its config files, as
well as improve the shared access during runtime.
2025-07-01 11:25:58 +02:00

109 lines
2.6 KiB
Rust

use std::ffi::OsString;
use std::path::PathBuf;
use std::process::Command;
use std::sync::Arc;
use crate::murmur::{Dictionary, HashGroup, IdString64, Murmur32, Murmur64};
#[derive(Clone)]
pub struct CmdLine {
cmd: OsString,
args: Vec<OsString>,
}
impl CmdLine {
pub fn new(cmd: impl Into<OsString>) -> Self {
Self {
cmd: cmd.into(),
args: vec![],
}
}
pub fn arg(&mut self, arg: impl Into<OsString>) -> &mut Self {
self.args.push(arg.into());
self
}
}
impl std::fmt::Debug for CmdLine {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("CmdLine")
.field("cmd", &self.cmd)
.field("args", &self.args)
.finish()
}
}
impl std::fmt::Display for CmdLine {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "\"{}\"", self.cmd.to_string_lossy())?;
for arg in &self.args {
write!(f, " \"{}\"", arg.to_string_lossy())?;
}
Ok(())
}
}
impl From<&CmdLine> for Command {
fn from(value: &CmdLine) -> Self {
let mut cmd = Command::new(&value.cmd);
cmd.args(&value.args);
cmd
}
}
pub struct Context {
pub lookup: Arc<Dictionary>,
pub ljd: Option<CmdLine>,
pub revorb: Option<String>,
pub ww2ogg: Option<String>,
pub game_dir: Option<PathBuf>,
}
impl Context {
pub fn new() -> Self {
Self {
lookup: Arc::new(Dictionary::new()),
ljd: None,
revorb: None,
ww2ogg: None,
game_dir: None,
}
}
pub fn lookup_hash<M>(&self, hash: M, group: HashGroup) -> IdString64
where
M: Into<Murmur64>,
{
let hash = hash.into();
if let Some(s) = self.lookup.lookup(hash, group) {
tracing::debug!(%hash, string = s, "Murmur64 lookup successful");
s.to_string().into()
} else {
tracing::debug!(%hash, "Murmur64 lookup failed");
hash.into()
}
}
pub fn lookup_hash_short<M>(&self, hash: M, group: HashGroup) -> String
where
M: Into<Murmur32>,
{
let hash = hash.into();
if let Some(s) = self.lookup.lookup_short(hash, group) {
tracing::debug!(%hash, string = s, "Murmur32 lookup successful");
s.to_owned()
} else {
tracing::debug!(%hash, "Murmur32 lookup failed");
format!("{hash:08X}")
}
}
}
impl Default for Context {
fn default() -> Self {
Self::new()
}
}