diff options
| author | Zeyla Hellyer <[email protected]> | 2017-06-10 21:55:33 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-06-10 21:55:33 -0700 |
| commit | d0b64cd64a18a6116267fa09a837d62c19cced42 (patch) | |
| tree | fc68a0891ea0ddd8187c38f289c8a9ccddc07e8c /src/model/utils.rs | |
| parent | Fix voice compilation (diff) | |
| download | serenity-d0b64cd64a18a6116267fa09a837d62c19cced42.tar.xz serenity-d0b64cd64a18a6116267fa09a837d62c19cced42.zip | |
Fix negative nonces failing to deserialize
Negative message nonces caused deserialization errors, as serde would
not deserialize integers into strings.
To fix this, change `Message::nonce` into an `Option<Snowflake>` from an
`Option<String>`. This new `Snowflake` is a wrapper around an `i64`. Use
a new `I64Visitor` to deserialize i64s, u64s, and strs into the wanted
i64.
Diffstat (limited to 'src/model/utils.rs')
| -rw-r--r-- | src/model/utils.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/model/utils.rs b/src/model/utils.rs index f88ecf5..6363fb6 100644 --- a/src/model/utils.rs +++ b/src/model/utils.rs @@ -240,3 +240,34 @@ impl<'de> Visitor<'de> for U64Visitor { Ok(v) } } + +pub struct I64Visitor; + +impl<'de> Visitor<'de> for I64Visitor { + type Value = i64; + + fn expecting(&self, formatter: &mut Formatter) -> FmtResult { + formatter.write_str("identifier") + } + + fn visit_str<E: DeError>(self, v: &str) -> StdResult<Self::Value, E> { + match v.parse::<i64>() { + Ok(v) => Ok(v), + Err(_) => { + let mut s = String::new(); + s.push_str("Unknown i64 value: "); + s.push_str(v); + + Err(DeError::custom(s)) + }, + } + } + + fn visit_i64<E: DeError>(self, v: i64) -> StdResult<Self::Value, E> { + Ok(v) + } + + fn visit_u64<E: DeError>(self, v: u64) -> StdResult<Self::Value, E> { + Ok(v as i64) + } +} |