rsmoji 0.3.3

Gitmoji, but oxidized!
use std::sync::Mutex;

use crate::globals::MAX_LIST_LENGTH;

pub struct UIState<'a> {
	pub offset: usize,
	pub selection: usize,
	pub user_input: String,
	pub filtered_emojis: Vec<&'a str>,
	pub insert_offset: usize,
}

impl UIState<'_> {
	pub fn emo_clamp(&self) -> usize {
		return self.filtered_emojis.len().clamp(0, MAX_LIST_LENGTH);
	}

	pub fn filter_emojis(&mut self, emojis: &Vec<&'static str>) {
		self.filtered_emojis = emojis
			.iter()
			.copied()
			.filter(|&emoji| {
				emoji
					.to_lowercase()
					.contains(&self.user_input.to_lowercase())
			})
			.collect();
	}
}

static ALREADY_INSTANTIATED: Mutex<bool> = Mutex::new(false);
pub fn instantiate_state() -> Option<UIState<'static>> {
	let mut guard = ALREADY_INSTANTIATED.lock().expect("Unable to lock Mutex");
	if *guard {
		return None;
	}

	*guard = true;
	let state = UIState {
		offset: 0,
		selection: 2,
		user_input: String::new(),
		filtered_emojis: vec![""],
		insert_offset: 0,
	};
	return Some(state);
}