From 4a152f07dab28cd9948668c4efd507eeaea18e2d Mon Sep 17 00:00:00 2001 From: Niklas Kapelle Date: Fri, 20 Mar 2026 13:10:23 +0100 Subject: [PATCH] improved NexusID parsing --- src/types/nexus_id.rs | 61 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/src/types/nexus_id.rs b/src/types/nexus_id.rs index ecd3fd0..594139e 100644 --- a/src/types/nexus_id.rs +++ b/src/types/nexus_id.rs @@ -1,6 +1,7 @@ -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use std::str::FromStr; -#[derive(Debug, Deserialize, Serialize, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct NexusID { mod_id: u64, file_id: u64, @@ -11,3 +12,59 @@ impl NexusID { Self { mod_id, file_id } } } + +impl Serialize for NexusID { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let s = format!("{}:{}", self.mod_id, self.file_id); + serializer.serialize_str(&s) + } +} + +impl<'de> Deserialize<'de> for NexusID { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + let mut parts = s.split(':'); + + let mod_id = parts + .next() + .ok_or_else(|| serde::de::Error::custom("missing first value")) + .and_then(|p| u64::from_str(p).map_err(serde::de::Error::custom))?; + + let file_id = parts + .next() + .ok_or_else(|| serde::de::Error::custom("missing second value")) + .and_then(|p| u64::from_str(p).map_err(serde::de::Error::custom))?; + + if parts.next().is_some() { + return Err(serde::de::Error::custom("too many parts")); + } + + Ok(Self { mod_id, file_id }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[derive(Deserialize, Serialize, PartialEq, Debug)] + struct Wrapper { + value: NexusID, + } + + #[test] + fn serde_roundtrip() { + let val = Wrapper { + value: NexusID::new(1234, 5678), + }; + let serialized = toml::to_string(&val).unwrap(); + let deserialized: Wrapper = toml::from_str(&serialized).unwrap(); + assert_eq!(val, deserialized); + } +}