use proc_macro2::Ident; use std::cmp::Ordering; #[derive(PartialEq, Eq)] pub struct Path { pub segments: Vec, } impl PartialOrd for Path { fn partial_cmp(&self, other: &Path) -> Option { Some(self.cmp(other)) } } impl Ord for Path { fn cmp(&self, other: &Path) -> Ordering { // Lexicographic ordering across path segments. for (lhs, rhs) in self.segments.iter().zip(&other.segments) { match cmp(&lhs.to_string(), &rhs.to_string()) { Ordering::Equal => {} non_eq => return non_eq, } } self.segments.len().cmp(&other.segments.len()) } } // TODO: more intelligent comparison // for example to handle numeric cases like E9 < E10. fn cmp(lhs: &str, rhs: &str) -> Ordering { // Sort `_` last. match (lhs == "_", rhs == "_") { (true, true) => return Ordering::Equal, (true, false) => return Ordering::Greater, (false, true) => return Ordering::Less, (false, false) => {} } let lhs = lhs.to_ascii_lowercase(); let rhs = rhs.to_ascii_lowercase(); // For now: asciibetical ordering. lhs.cmp(&rhs) }