onefetch_image/
lib.rs
1use anyhow::Result;
2use image::DynamicImage;
3
4#[derive(clap::ValueEnum, Clone, PartialEq, Eq, Debug)]
5pub enum ImageProtocol {
6 Kitty,
7 Sixel,
8 Iterm,
9}
10
11#[cfg(not(windows))]
12pub mod iterm;
13#[cfg(not(windows))]
14pub mod kitty;
15#[cfg(not(windows))]
16pub mod sixel;
17
18pub trait ImageBackend {
19 fn add_image(&self, lines: Vec<String>, image: &DynamicImage, colors: usize) -> Result<String>;
20}
21
22pub fn get_best_backend() -> Option<Box<dyn ImageBackend>> {
23 #[cfg(not(windows))]
24 if kitty::KittyBackend::supported() {
25 Some(Box::new(kitty::KittyBackend::new()))
26 } else if iterm::ITermBackend::supported() {
27 Some(Box::new(iterm::ITermBackend::new()))
28 } else if sixel::SixelBackend::supported() {
29 Some(Box::new(sixel::SixelBackend::new()))
30 } else {
31 None
32 }
33
34 #[cfg(windows)]
35 None
36}
37
38#[allow(unused_variables)]
39pub fn get_image_backend(image_protocol: ImageProtocol) -> Option<Box<dyn ImageBackend>> {
40 #[cfg(not(windows))]
41 let backend = Some(match image_protocol {
42 ImageProtocol::Kitty => Box::new(kitty::KittyBackend::new()) as Box<dyn ImageBackend>,
43 ImageProtocol::Iterm => Box::new(iterm::ITermBackend::new()) as Box<dyn ImageBackend>,
44 ImageProtocol::Sixel => Box::new(sixel::SixelBackend::new()) as Box<dyn ImageBackend>,
45 });
46
47 #[cfg(windows)]
48 let backend = None;
49 backend
50}
51
52#[cfg(not(windows))]
53unsafe fn get_dimensions() -> libc::winsize {
54 use libc::{ioctl, winsize, STDOUT_FILENO, TIOCGWINSZ};
55 use std::mem::zeroed;
56
57 let mut window: winsize = zeroed();
58 let result = ioctl(STDOUT_FILENO, TIOCGWINSZ, &mut window);
59
60 if result == -1 {
61 zeroed()
62 } else {
63 window
64 }
65}