diff --git a/src/bin.rs b/src/bin.rs index 143f4cd..d2a9f35 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -503,28 +503,43 @@ where { let self_number: JsonNumber = self_input.into(); let other_number: JsonNumber = other_input.into(); - // TODO: Figure out how javascript compares floats and ints match (self_number, other_number) { (JsonNumber::Failure, _) => return None, (_, JsonNumber::Failure) => return None, (JsonNumber::UnsignedInteger(self_num), JsonNumber::UnsignedInteger(other_num)) => { return self_num.partial_cmp(&other_num) } - (JsonNumber::UnsignedInteger(_self_num), JsonNumber::SignedInteger(_other_num)) => { - return Some(Ordering::Greater) + (JsonNumber::UnsignedInteger(self_num), JsonNumber::SignedInteger(other_num)) => { + if self_num < std::i64::MAX as u64 { + return (self_num as i64).partial_cmp(&other_num); + } else { + return Some(Ordering::Greater); + } + } + (JsonNumber::UnsignedInteger(self_num), JsonNumber::Decimal(other_num)) => { + return (self_num as f64).partial_cmp(&other_num) } - (JsonNumber::UnsignedInteger(_self_num), JsonNumber::Decimal(_other_num)) => return None, - (JsonNumber::SignedInteger(_self_num), JsonNumber::UnsignedInteger(_other_num)) => { - return Some(Ordering::Less) + (JsonNumber::SignedInteger(self_num), JsonNumber::UnsignedInteger(other_num)) => { + if other_num < std::i64::MAX as u64 { + return self_num.partial_cmp(&(other_num as i64)); + } else { + return Some(Ordering::Less); + } } (JsonNumber::SignedInteger(self_num), JsonNumber::SignedInteger(other_num)) => { return self_num.partial_cmp(&other_num) } - (JsonNumber::SignedInteger(_self_num), JsonNumber::Decimal(_other_num)) => return None, + (JsonNumber::SignedInteger(self_num), JsonNumber::Decimal(other_num)) => { + return (self_num as f64).partial_cmp(&other_num) + } - (JsonNumber::Decimal(_self_num), JsonNumber::UnsignedInteger(_other_num)) => return None, - (JsonNumber::Decimal(_self_num), JsonNumber::SignedInteger(_other_num)) => return None, + (JsonNumber::Decimal(self_num), JsonNumber::UnsignedInteger(other_num)) => { + return self_num.partial_cmp(&(other_num as f64)) + } + (JsonNumber::Decimal(self_num), JsonNumber::SignedInteger(other_num)) => { + return self_num.partial_cmp(&(other_num as f64)) + } (JsonNumber::Decimal(self_num), JsonNumber::Decimal(other_num)) => { return self_num.partial_cmp(&other_num) }