nucleo_picker/render.rs
1//! # Renderers for use in a [`Picker`](super::Picker)
2//!
3//! This module contains built-in renderers to be used in a [`Picker`](super::Picker), and (with
4//! appropriate types) can be used as the arguments passed to the
5//! [`PickerOptions::picker`](super::PickerOptions::picker) and [`Picker::new`](super::Picker::new)
6//! methods.
7use std::{borrow::Cow, path::Path};
8
9use super::Render;
10
11/// A renderer for any type which de-references as [`str`], such as a [`String`].
12///
13/// ## Example
14/// ```
15/// # use nucleo_picker::{render::StrRenderer, Render};
16/// let str_renderer = StrRenderer;
17///
18/// let st = "Hello!".to_owned();
19///
20/// assert_eq!(str_renderer.render(&st), "Hello!");
21/// ```
22pub struct StrRenderer;
23
24impl<T: AsRef<str>> Render<T> for StrRenderer {
25 type Str<'a>
26 = &'a str
27 where
28 T: 'a;
29
30 fn render<'a>(&self, item: &'a T) -> Self::Str<'a> {
31 item.as_ref()
32 }
33}
34
35/// A renderer for any type which de-references as [`Path`], such as a
36/// [`PathBuf`](std::path::PathBuf).
37///
38/// ## Example
39/// ```
40/// # use nucleo_picker::{render::PathRenderer, Render};
41/// use std::path::PathBuf;
42/// let path_renderer = PathRenderer;
43///
44/// let mut path = PathBuf::new();
45///
46/// path.push("/");
47/// path.push("dev");
48/// path.push("null");
49///
50/// // Note: platform-dependent output
51/// assert_eq!(path_renderer.render(&path), "/dev/null");
52/// ```
53pub struct PathRenderer;
54
55impl<T: AsRef<Path>> Render<T> for PathRenderer {
56 type Str<'a>
57 = Cow<'a, str>
58 where
59 T: 'a;
60
61 fn render<'a>(&self, item: &'a T) -> Self::Str<'a> {
62 item.as_ref().to_string_lossy()
63 }
64}
65
66/// A renderer which uses a type's [`Display`](std::fmt::Display) implementation.
67///
68/// ## Example
69/// ```
70/// # use nucleo_picker::{render::DisplayRenderer, Render};
71/// let display_renderer = DisplayRenderer;
72///
73/// assert_eq!(display_renderer.render(&1.624f32), "1.624");
74/// ```
75pub struct DisplayRenderer;
76
77impl<T: ToString> Render<T> for DisplayRenderer {
78 type Str<'a>
79 = String
80 where
81 T: 'a;
82
83 fn render<'a>(&self, item: &'a T) -> Self::Str<'a> {
84 item.to_string()
85 }
86}