# keygen-rs
This is a tool to generate rust code with hierarchical string constants from a simple file.
## Usage
The library exposes two functions:
`generate(input: &PathBuf) -> Result<(), String>`
and
`generate_with_config(input: &PathBuf, output_dir: Option<&PathBuf>, ) -> Result<(), String>`
Please look in the documentation for `generate_with_config` to see an explanation for the parameters. Calling these methods will create a file `constants.rs` in the output directory (default: `generated/keygen`). This file has to be included in your project to be used.
## Input format
There are two variants of the input format: hierarchical or enumerated.
The hierarchical variant is simmilar to yaml and based on indentations.
**You are ABLE to mix tabs and spaces for indentations, but it is NOT RECOMMENDED.
If these are used simulaneously a tab is treated like 4 spaces!
So please just use one or the other.**
An example for a hierarchical input file looks like this:
````
hierarchical
keys
with
five
layers
six
hierarchical
layers
````
The enumerated variant lists all the desired keys with `.` as the separator and looks like this:
````
hierarchical.keys
hierarchical.keys.with.five.layers
hierarchical.keys.with.six.hierarchical.layers
````
(Redundant enumeration of subkeys is possible but not necessary).
You may also mix these variants by creating an input file like this:
````
hierarchical.keys.with
five.layers
six
hierarchical
layers
````
## Output format
The output file for the above input will look (syntactically) like this:
````rust
#![allow(dead_code)]
#![allow(non_upper_case_globals)]
pub mod hierarchical {
const _BASE : &str = "hierarchical";
pub mod keys {
pub const _BASE: &str = "hierarchical.keys";
pub mod with {
pub const _BASE: &str = "hierarchical.keys.with";
pub mod five {
pub const _BASE: &str = "hierarchical.keys.with.five";
pub const layers: &str = "hierarchical.keys.with.five.layers";
}
pub mod six {
pub const _BASE: &str = "hierarchical.keys.with.six";
pub mod hierarchical {
pub const _BASE: &str = "hierarchical.keys.with.six.hierarchical";
pub const layers: &str = "hierarchical.keys.with.six.hierarchical.layers";
}
}
}
}
}
````
Therefore you can use the keys like this `constants::hierarchical::keys::with::five::layers` or `constants::hierarchical::keys::BASE`.