# Welcome
`nstd` not good enough? Let's make it better. This text is here to provide a formal introduction on
how to contribute to the `nstd` codebase. The code is currently hosted on GitHub at
https://github.com/RustEnthusiast/nstd. Make a clone or fork of the repository to get started.
Please note that you may need to know a bit of Rust and C before contributing.
# Sections
- [Adding a module](#adding-a-module)
- [Adding a submodule](#adding-a-submodule)
- [Adding a type](#adding-a-type)
- [Adding a function](#adding-a-function)
# Adding a module
Adding a top-level module to `nstd` is fairly straight forward, but requires a few tedious steps.
## Create a Cargo feature for the module
The first thing you'll need to do when creating a new module is create a feature for the module.
This will allow users of the framework to disable compilation of our module if their code doesn't
require it.
To do this, open the `Cargo.toml` file and head to the `[features]` section. The module features
are listed in alphabetical order following the `default`, `std`, `capi`, and `link` features. Place
the new feature where it is appropriate.
The new feature should look something like this: `{module_name} = []`.
The square brackets contain any dependencies that our module requires.
## Add the module header
Each top-level module needs a C header file in the `include/nstd` directory in the repository
describing the module's API. The header file shall be named `{module_name}.h`. There should now be
a new file located at `include/nstd/{module_name}.h`.
Each header file needs a header guard. `nstd` does not use the `#pragma once` directive as it is not
strictly part of the C standard, so don't use this approach. Instead we will use a form of header
guards that are guaranteed to work with any compiler. Header guard definitions in `nstd` are just a
path to the file from within the `include` directory. The header guard should look like this:
```c
#ifndef NSTD_{MODULE_NAME}_H
#define NSTD_{MODULE_NAME}_H
#endif
```
The `include/nstd.h` header includes all top-level headers in alphabetical order, be sure to
include your header in this file.
## Add the source file
You will now need to add a Rust source file that defines your module's API. Create a new Rust
source file in the `src` directory named `{module_name}.rs`. Make sure to give a description of
your module with a `//!` comment at the top of the file. Since we are creating a top-level module
we will need to modify the `src/lib.rs` file by declaring our module in there. All other top-level
modules are listed here in alphabetical order. Every top-level module must be hidden behind a
feature gate, we will need to enforce that here by using Rust's `cfg` attribute. Place a
declaration of your module where it is appropriate. The module declaration should look like this:
```rs
#[cfg(feature = "{module_name}")]
#[cfg_attr(doc_cfg, doc(cfg(feature = "{module_name}")))]
pub mod {module_name};
```
## Update the README
This step isn't that important but it is technically required. The repo's `README.md` markdown file
contains an alphabetically sorted list of `nstd`'s modules along with a short description of each
module. Place your module into this tree where it is appropriate.
# Adding a submodule
```rs
todo!();
```
# Adding a type
```rs
todo!();
```
# Adding a function
```rs
todo!();
```