use shared::names::Site; trait IndexArithmetic { fn index_add(self, length: usize, num: usize) -> usize; fn index_subtract(self, length: usize, num: usize) -> usize; } impl IndexArithmetic for usize { fn index_add(self, length: usize, num: usize) -> usize { if self > (length - 1) { return 0; } return self + num; } fn index_subtract(self, length: usize, num: usize) -> usize { match self.checked_sub(num) { Some(num) => num, None => length - 1, } } } pub fn previous_url(source_url: &String, names: &Vec) -> Option { match names.iter().position(|r| &r.url == source_url) { Some(index) => Some(names[index.index_subtract(names.len(), 1)].url.clone()), None => None, } } pub fn next_url(source_url: &String, names: &Vec) -> Option { // this is gay match names.iter().position(|r| &r.url == source_url) { Some(index) => Some(names[index.index_add(names.len(), 1)].url.clone()), None => None, } } pub fn previous_name(source_url: &String, names: &Vec) -> Option { match names.iter().position(|r| &r.url == source_url) { Some(index) => match &names[index.index_subtract(names.len(), 1)].name { Some(name) => Some(name.clone()), None => previous_url(source_url, names), }, None => None, } } pub fn next_name(source_url: &String, names: &Vec) -> Option { match names.iter().position(|r| &r.url == source_url) { Some(index) => match &names[index.index_add(names.len(), 1)].name { Some(name) => Some(name.clone()), None => next_url(source_url, names), }, None => None, } }