use std::sync::Arc;
use nucleo as nc;
use super::Render;
pub struct Injector<T, R> {
inner: nc::Injector<T>,
render: Arc<R>,
}
impl<T, R> Clone for Injector<T, R> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
render: self.render.clone(),
}
}
}
impl<T: Send + Sync + 'static, R: Render<T>> Injector<T, R> {
pub(crate) fn new(inner: nc::Injector<T>, render: Arc<R>) -> Self {
Self { inner, render }
}
}
impl<T, R: Render<T>> Injector<T, R> {
pub fn push(&self, item: T) {
self.inner.push(item, |s, columns| {
columns[0] = self.render.render(s).as_ref().into();
});
}
}
impl<T, R: Render<T>> Extend<T> for Injector<T, R> {
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
for it in iter {
self.push(it);
}
}
}
#[cfg(feature = "serde")]
mod serde {
use serde::{
de::{DeserializeSeed, Deserializer, SeqAccess, Visitor},
Deserialize,
};
use super::Injector;
use crate::Render;
impl<'de, T, R> Visitor<'de> for &Injector<T, R>
where
T: Send + Sync + 'static + Deserialize<'de>,
R: Render<T>,
{
type Value = ();
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.write_str("a sequence of picker items")
}
fn visit_seq<S>(self, mut seq: S) -> Result<(), S::Error>
where
S: SeqAccess<'de>,
{
while let Some(item) = seq.next_element()? {
self.push(item);
}
Ok(())
}
}
impl<'de, T, R> DeserializeSeed<'de> for &Injector<T, R>
where
T: Send + Sync + 'static + Deserialize<'de>,
R: Render<T>,
{
type Value = ();
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_seq(self)
}
}
}