improved NexusID parsing
This commit is contained in:
@@ -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 {
|
pub struct NexusID {
|
||||||
mod_id: u64,
|
mod_id: u64,
|
||||||
file_id: u64,
|
file_id: u64,
|
||||||
@@ -11,3 +12,59 @@ impl NexusID {
|
|||||||
Self { mod_id, file_id }
|
Self { mod_id, file_id }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Serialize for NexusID {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
let s = format!("{}:{}", self.mod_id, self.file_id);
|
||||||
|
serializer.serialize_str(&s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for NexusID {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user