Skip to content

Commit

Permalink
feat: Added proper addr and threadid wrappers
Browse files Browse the repository at this point in the history
  • Loading branch information
mitsuhiko committed Mar 24, 2018
1 parent 211f917 commit 3a9f06e
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
#[macro_use]
extern crate serde_plain;
extern crate url;
extern crate url_serde;
Expand Down
45 changes: 45 additions & 0 deletions src/protocol/v7.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ pub struct Stacktrace {

/// Represents a thread id.
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Ord, PartialOrd, Hash)]
#[serde(untagged)]
pub enum ThreadId {
/// Integer representation for the thread id
Int(i64),
Expand All @@ -168,6 +169,16 @@ impl fmt::Display for ThreadId {
}
}

/// Represents an address.
#[derive(Default, Debug, Clone, PartialEq, Eq, Ord, PartialOrd, Hash)]
pub struct Addr(pub u64);

impl fmt::Display for Addr {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "0x{:x}", self.0)
}
}

/// Represents a single thread.
#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)]
#[serde(default)]
Expand Down Expand Up @@ -908,3 +919,37 @@ impl Serialize for DebugImage {
c.serialize(serializer)
}
}

impl<'de> Deserialize<'de> for Addr {
fn deserialize<D>(deserializer: D) -> Result<Addr, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum Repr {
Str(String),
Uint(u64),
}

Ok(Addr(match Repr::deserialize(deserializer).map_err(D::Error::custom)? {
Repr::Str(s) => {
if s.len() > 2 && (&s[..2] == "0x" || &s[..2] == "0X") {
u64::from_str_radix(&s[2..], 16).map_err(D::Error::custom)?
} else {
u64::from_str_radix(&s, 10).map_err(D::Error::custom)?
}
}
Repr::Uint(val) => val
}))
}
}

impl Serialize for Addr {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&format!("0x{:0x}", self.0))
}
}
22 changes: 22 additions & 0 deletions tests/test_protocol_v7.rs
Original file line number Diff line number Diff line change
Expand Up @@ -485,3 +485,25 @@ fn test_full_exception_stacktrace() {
\"symbol_addr\":0}],\"frames_omitted\":[1,2]}}]}}"
);
}

#[test]
fn test_addr_format() {
assert_eq!(serde_json::to_string(&v7::Addr(0)).unwrap(), "\"0x0\"");
assert_eq!(serde_json::to_string(&v7::Addr(42)).unwrap(), "\"0x2a\"");
assert_eq!(serde_json::from_str::<v7::Addr>("0").unwrap(), v7::Addr(0));
assert_eq!(serde_json::from_str::<v7::Addr>("\"0\"").unwrap(), v7::Addr(0));
assert_eq!(serde_json::from_str::<v7::Addr>("\"0x0\"").unwrap(), v7::Addr(0));
assert_eq!(serde_json::from_str::<v7::Addr>("42").unwrap(), v7::Addr(42));
assert_eq!(serde_json::from_str::<v7::Addr>("\"42\"").unwrap(), v7::Addr(42));
assert_eq!(serde_json::from_str::<v7::Addr>("\"0x2a\"").unwrap(), v7::Addr(42));
assert_eq!(serde_json::from_str::<v7::Addr>("\"0X2A\"").unwrap(), v7::Addr(42));
}

#[test]
fn test_thread_id_format() {
assert_eq!(serde_json::to_string(&v7::ThreadId::Int(0)).unwrap(), "0");
assert_eq!(serde_json::to_string(&v7::ThreadId::Int(42)).unwrap(), "42");
assert_eq!(serde_json::to_string(&v7::ThreadId::String("x".into())).unwrap(), "\"x\"");
assert_eq!(serde_json::from_str::<v7::ThreadId>("0").unwrap(), v7::ThreadId::Int(0));
assert_eq!(serde_json::from_str::<v7::ThreadId>("\"0\"").unwrap(), v7::ThreadId::String("0".into()));
}

0 comments on commit 3a9f06e

Please sign in to comment.