minicrossterm/docs/Contributing.md
2019-09-17 20:40:50 +02:00

2.8 KiB

Contributing

I would appreciate any contributions to this crate. However, some things are handy to know.

Architecture

Crossterm is using ANSI escape codes by default for both Unix and for Windows systems except for Windows versions lower than 10. Crossterm uses WinAPI in this case.

Crates

The crossterm crate consists of 7 crates:

Module structure

If you would like to contribute, then please follow the existing structure. For example, the cursor crate has the following file structure:

└── src
    ├── cursor
    │   ├── ansi_cursor.rs
    │   ├── cursor.rs
    │   └── winapi_cursor.rs
    ├── cursor.rs
    ├── lib.rs
    ├── sys
    │   ├── unix.rs
    │   └── winapi.rs
    └── sys.rs
  • src/cursor.rs - ITerminalCursor trait for other modules to implement
  • src/cursor/cursor.rs - cursor functionality for the end user
  • src/cursor/winapi_cursor.rs - WinAPI based implementation
  • src/cursor/ansi_cursor.rs - ANSI escape codes based implementation
  • src/sys - platform specific logic

The above structure is the same for other modules.

Why I have chosen this design:

  • You can easily add new platform by implementing the trait
  • You can keep the functionality for different platforms separated
  • You have one API the user can call like in the src/cursor/cursor.rs

Try to avoid changing src/cursor/cursor.rs a lot, because it contains API for the end-user.

Code style

Import Order

All imports are semantically grouped and ordered. The order is:

  • standard library (use std::...)
  • external crates (use rand::...)
  • current crate (use crate::...)
  • parent module (use super::..)
  • current module (use self::...)
  • module declaration (mod ...)

There must be an empty line between groups.

An example:

use crossterm_utils::{csi, write_cout, Result};

use crate::sys::{get_cursor_position, show_cursor};

use super::ITerminalCursor;

Warnings

The code must be warning free. It's quite hard to find an error if the build logs are polluted with warnings. If you decide to silent a warning with (#[allow(...)]), please add a comment why it's required.

Always consult the Travis CI build logs.