A little app to serve my photography from my personal website

order blog posts by date vs. random hash ordering

ericwood.org c7686b55 8c2e212f

Waiting for spindle ...
+32 -4
+16 -3
src/blog.rs
··· 78 78 } 79 79 80 80 pub fn all(&self) -> Vec<Arc<BlogPost>> { 81 - self.by_slug.values().cloned().collect() 81 + let mut posts: Vec<Arc<BlogPost>> = self.by_slug.values().cloned().collect(); 82 + sort_posts(&mut posts); 83 + posts 82 84 } 83 85 84 86 pub fn all_tags(&self) -> Vec<(String, usize)> { ··· 97 99 } 98 100 99 101 pub fn get_by_tag(&self, tag: &str) -> Vec<Arc<BlogPost>> { 100 - self.by_tag 102 + let mut posts = self 103 + .by_tag 101 104 .get(tag) 102 105 .unwrap_or(&Vec::<Arc<BlogPost>>::new()) 103 - .to_vec() 106 + .to_vec(); 107 + sort_posts(&mut posts); 108 + posts 104 109 } 110 + } 111 + 112 + fn sort_posts(posts: &mut [Arc<BlogPost>]) { 113 + posts.sort_by(|a, b| { 114 + let a = a.published_at.clone().unwrap_or(DateTime::min_date()); 115 + let b = b.published_at.clone().unwrap_or(DateTime::min_date()); 116 + b.cmp(&a) 117 + }); 105 118 } 106 119 107 120 #[derive(serde::Deserialize, serde::Serialize, Clone)]
+16 -1
src/date_time.rs
··· 1 + use core::cmp::Ord; 1 2 use std::{convert, fmt, str}; 2 3 3 4 use chrono::{self, FixedOffset, ParseError}; ··· 6 7 de::{self, Visitor}, 7 8 }; 8 9 9 - #[derive(Clone)] 10 + #[derive(Clone, PartialOrd, Ord)] 10 11 pub struct DateTime(chrono::DateTime<FixedOffset>); 12 + 13 + impl DateTime { 14 + pub fn min_date() -> Self { 15 + Self(chrono::DateTime::<FixedOffset>::MIN_UTC.fixed_offset()) 16 + } 17 + } 11 18 12 19 impl convert::TryFrom<String> for DateTime { 13 20 type Error = ParseError; ··· 29 36 value.0.to_rfc3339() 30 37 } 31 38 } 39 + 40 + impl PartialEq for DateTime { 41 + fn eq(&self, other: &Self) -> bool { 42 + self.0 == other.0 43 + } 44 + } 45 + 46 + impl Eq for DateTime {} 32 47 33 48 struct DateTimeVisitor; 34 49