# SCGSM Rust Edition v0.2.1
## Developed by Spencer Smith (spenny@geniuspiece.com)
### Last updated 26 August 2020
*SCGSM* is a very simple specification for saving and managing game data.
## Usage
This library is available through crates.io! To add it to your project, simply add the following line underneath the dependencies tag in your *Cargo.toml* file:
`scgsm = "0.2.1"`
## Syntax
The structure of an *SCGSM* file (*.scgs*) is as follows:
```
FLAG_A|1
FLAG_B|2
FLAG_C|3
```
There must be only one key/value pair per line, and there must be no spaces between the parameters and pipe.
## Changes from previous versions
### August 26, 2020
- Added new `cast_value` function to easily parse flag values and store in variables.
### August 25, 2020
- Project renamed to avoid conflicts with another SCFS.
- In the original C++ implementation of *SCGSM*, there was a function called `sc::GSM::parse()` that would read the *.scgs* file line by line and split it into separate strings. This function was unnecessary in the Rust Edition and all that functionality has been condensed into the `SCGSM::load_flags()` function instead.
- Originally *.scgs* files would end with the line "ENDFLAGS", however this was decided to be redundant and thus removed from this version of the specification.
## Glossary
`pub struct Flag` - Structure which defines all of the in-game flags. Has two member variables, `pub key: String` and `pub value: String`.
`pub fn Flag::init(k: &str, v: &str) -> Flag` - Function that creates a new `Flag` with `key` k and `value` v.
`pub struct SCGSM` - Structure which defines objects and functions for saving, loading, and managing game data. Has one member variable, `pub flags: Vec<Flag>`, which stores all of the flags in memory.
`pub fn SCGSM::init() -> SCGSM` - Function that creates a new `SCGSM` variable with an empty vector.
`pub fn SCGSM::add_flag(&mut self, k: &str, v: &str)` - This function creates a new `Flag` object `f` and then calls `self.flags.push(f)`.
`pub fn SCGSM::cast_value<T>(&mut self, i: usize) -> T` - This function allows you to easily parse flag values to different types for saving in variables. The `i` parameter is the index of the `Flag` object in the `flags` vector, which is indexed in the order that flags are written in the *.scgs* script, starting from 0.
`pub fn SCGSM::load_flags(&mut self, sf: &str)` - This function reads the output of file *sf* line by line and uses a string splitting algorithm to create new flags for each line and add them to the `flags` vector.
`pub fn SCGSM::save_flags(&mut self, sf: &str) -> std::io::Result<()>` - This function writes the output of `SCGSM::viewFlags()` to file *sf*.
`pub fn SCGSM::update_flag(&mut self, k: &str, v: &str)` - This function modifies the value of `Flag` objects by iterating through the `flags` list to find the key that matches `k` and changing the value of that flag to `v`. If the flag key cannot be found, the function will fail.
`pub fn SCGSM::view_flags(&mut self) -> String` - This function returns the entire `flags` list as a `String` object.