Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/sunfishcode/rustix-is-terminal

Test whether a given stream is a terminal, using rustix
https://github.com/sunfishcode/rustix-is-terminal

Last synced: 5 days ago
JSON representation

Test whether a given stream is a terminal, using rustix

Awesome Lists containing this project

README

        


rustix-is-terminal


Test whether a given stream is a terminal, using rustix


Github Actions CI Status
crates.io page
docs.rs docs


As of Rust 1.70, most users should use the [`IsTerminal`] trait in the Rust
standard library instead of this crate.

This crate is similar to the [is-terminal] crate, but uses `rustix` instead
of `libc` in its implementation. This allows it to support `no_std` on
`unix`-family platforms.

[is-terminal]: https://crates.io/crates/is-terminal/


rustix-is-terminal is a simple utility that answers one question:

> Is this a terminal?

A "terminal", also known as a "tty", is an I/O device which may be interactive
and may support color and other special features. This crate doesn't provide
any of those features; it just answers this one question.

On Unix-family platforms, this is effectively the same as the [`isatty`]
function for testing whether a given stream is a terminal, though it accepts
high-level stream types instead of raw file descriptors.

On Windows, it uses a variety of techniques to determine whether the given
stream is a terminal.

This crate is derived from [the atty crate] with [PR \#51] bug fix and
[PR \#54] port to windows-sys applied. The only additional difference is that
the atty crate only accepts stdin, stdout, or stderr, while this crate accepts
any stream. In particular, this crate does not access any stream that is not
passed to it, in accordance with [I/O safety].

[PR \#51]: https://github.com/softprops/atty/pull/51
[PR \#54]: https://github.com/softprops/atty/pull/54

## Example

```rust
use rustix_is_terminal::IsTerminal;

fn main() {
if std::io::stdout().is_terminal() {
println!("Stdout is a terminal");
} else {
println!("Stdout is not a terminal");
}
}
```

## Testing

This library is tested on both Unix-family and Windows platforms.

To test it on a platform manually, use the provided `stdio` example program.
When run normally, it prints this:

```bash
$ cargo run --example stdio
stdin? true
stdout? true
stderr? true
```

To test stdin, pipe some text to the program:

```bash
$ cat | cargo run --example stdio
stdin? false
stdout? true
stderr? true
```

To test stdout, pipe the program to something:

```bash
$ cargo run --example stdio | cat
stdin? true
stdout? false
stderr? true
```

To test stderr, pipe the program to something redirecting stderr:

```bash
$ cargo run --example stdio 2>&1 | cat
stdin? true
stdout? false
stderr? false
```

# Minimum Supported Rust Version (MSRV)

This crate currently works on the version of [Rust on Debian stable], which is
currently Rust 1.63. This policy may change in the future, in minor version
releases, so users using a fixed version of Rust should pin to a specific
version of this crate.

[`isatty`]: https://man7.org/linux/man-pages/man3/isatty.3.html
[the atty crate]: https://crates.io/crates/atty
[I/O safety]: https://github.com/rust-lang/rfcs/blob/master/text/3128-io-safety.md
[Rust on Debian stable]: https://packages.debian.org/stable/rust/rustc
[`IsTerminal`]: https://doc.rust-lang.org/stable/std/io/trait.IsTerminal.html