jid: skip `at` and `slash` in comparison operators

They only contain cached information and thus don't need to be included
in comparison and identity operators.

Fixes #123.
This commit is contained in:
Jonas Schäfer 2024-04-15 18:58:02 +02:00
parent c895cb1009
commit c08946aa7c
1 changed files with 27 additions and 1 deletions

View File

@ -32,7 +32,9 @@
use core::num::NonZeroU16;
use std::borrow::{Borrow, Cow};
use std::cmp::Ordering;
use std::fmt;
use std::hash::{Hash, Hasher};
use std::ops::Deref;
use std::str::FromStr;
@ -78,13 +80,37 @@ fn length_check(len: usize, error_empty: Error, error_too_long: Error) -> Result
///
/// This dynamic type on the other hand can be used in contexts where it is
/// not known, at compile-time, whether a JID is full or bare.
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[derive(Debug, Clone, Eq)]
pub struct Jid {
normalized: String,
at: Option<NonZeroU16>,
slash: Option<NonZeroU16>,
}
impl PartialEq for Jid {
fn eq(&self, other: &Jid) -> bool {
self.normalized == other.normalized
}
}
impl PartialOrd for Jid {
fn partial_cmp(&self, other: &Jid) -> Option<Ordering> {
self.normalized.partial_cmp(&other.normalized)
}
}
impl Ord for Jid {
fn cmp(&self, other: &Jid) -> Ordering {
self.normalized.cmp(&other.normalized)
}
}
impl Hash for Jid {
fn hash<H: Hasher>(&self, state: &mut H) {
self.normalized.hash(state)
}
}
impl FromStr for Jid {
type Err = Error;