ioctl-term-light 0.1.0

Lightweight crate to retrieve the dimensions (.i.e.: width/height) of a UNIX terminal in terms of rows/columns.
Documentation
#![allow(unused)]

use std::os::fd::AsRawFd;

use crate::c::{c_int, ioctl_get_dimensions};
use crate::Dimensions;

#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)]
pub enum FileDescriptor {
    Stdin,
    Stdout,
    Stderr,
    #[cfg(feature = "any-fd")]
    Any(i32),
}
impl FileDescriptor {
    pub fn no(self) -> i32 {
        match self {
            FileDescriptor::Stdin => 0,
            FileDescriptor::Stdout => 1,
            FileDescriptor::Stderr => 2,
            #[cfg(feature = "any-fd")]
            FileDescriptor::Any(no) => no,
        }
    }
    pub fn get_dimensions(self) -> Option<(u16, u16)> {
        let ws = unsafe { ioctl_get_dimensions(self.no()) };
        if ws.ws_col == 0 || ws.ws_row == 0 {
            None
        } else {
            Some((ws.ws_col as u16, ws.ws_row as u16))
        }
    }
    pub fn dimensions(self) -> Dimensions {
        Dimensions::from(self.get_dimensions())
    }
}

impl AsRawFd for FileDescriptor {
    fn as_raw_fd(&self) -> c_int {
        self.no()
    }
}

#[cfg(test)]
mod tests {
    use super::FileDescriptor;
    use crate::Dimensions;

    #[test]
    fn test_file_descriptor_stdout_get_dimensions() {
        let dimensions = FileDescriptor::Stdout.get_dimensions();
        assert_ne!(
            dimensions, None,
            "expected FileDescriptor::Stdout::get_dimensions() to not return None"
        );
        assert_ne!(
            dimensions,
            Some((0, 0)),
            "expected FileDescriptor::Stdout::get_dimensions() to not return Some((0, 0))"
        );
    }

    #[test]
    fn test_file_descriptor_stdin_get_dimensions() {
        let dimensions = FileDescriptor::Stdin.get_dimensions();
        assert_ne!(
            dimensions, None,
            "expected FileDescriptor::Stdin::get_dimensions() to not return None"
        );
        assert_ne!(
            dimensions,
            Some((0, 0)),
            "expected FileDescriptor::Stdin::get_dimensions() to not return Some((0, 0))"
        );
    }
    #[test]
    fn test_file_descriptor_stderr_get_dimensions() {
        let dimensions = FileDescriptor::Stderr.get_dimensions();
        assert_ne!(
            dimensions, None,
            "expected FileDescriptor::Stderr::get_dimensions() to not return None"
        );
        assert_ne!(
            dimensions,
            Some((0, 0)),
            "expected FileDescriptor::Stderr::get_dimensions() to not return Some((0, 0))"
        );
    }

    #[test]
    fn test_file_descriptor_stdout_dimensions() {
        let dimensions = FileDescriptor::Stdout.dimensions();
        let unexpected = Dimensions::from((0u16, 0u16));
        assert_ne!(
            dimensions, unexpected,
            "expected FileDescriptor::Stdout::get_dimensions() to not return {unexpected:#?}"
        );
    }
    #[test]
    fn test_file_descriptor_stdin_dimensions() {
        let dimensions = FileDescriptor::Stdin.dimensions();
        let unexpected = Dimensions::from((0u16, 0u16));
        assert_ne!(
            dimensions, unexpected,
            "expected FileDescriptor::Stdin::get_dimensions() to not return {unexpected:#?}"
        );
    }
    #[test]
    fn test_file_descriptor_stderr_dimensions() {
        let dimensions = FileDescriptor::Stderr.dimensions();
        let unexpected = Dimensions::from((0u16, 0u16));
        assert_ne!(
            dimensions, unexpected,
            "expected FileDescriptor::Stderr::get_dimensions() to not return {unexpected:#?}"
        );
    }
}