Skip to content

Commit

Permalink
Create README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
mariiaan authored Feb 1, 2025
1 parent d30d778 commit 3b7c317
Showing 1 changed file with 145 additions and 0 deletions.
145 changes: 145 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
# minipp

A lightweight, header-only C++14 parser and writer for the mini config format.

## Description
minipp provides a convenient way to parse and write configuration files in the "mini" format. This format is characterized by its human-readable structure and nested sections, making it ideal for application configurations.

## Features

- **Parsing**: Extract values from existing mini configuration files.
- Supports strings, integers, floats, booleans, arrays, and nested sections.

- **Writing**: Generate new mini configuration files.
- Create complex structures with nested sections and various data types.

- **Single Header**: minipp is a single-header library, meaning you only need to include one file.

## Usage

To use minipp in your project:

```cpp
#define MINIPP_IMPLEMENTATION
#include "minipp.hpp"
```

Then, you can use `minipp::MiniPPFile` to parse and write mini files throughout your code.

### Example Usage

```cpp
#define MINIPP_IMPLEMENTATION
#include "minipp.hpp"

using namespace minipp;

int main()
{
// Make room for a result variable.
EResult result;

MiniPPFile file;
result = file.Parse("test.mini");
auto& root = file.GetRoot();

MiniPPFile::Section* gameSection = nullptr;
result = root.GetSubSection("game", &gameSection);
MiniPPFile::Values::StringValue* nameValue = nullptr;
result = gameSection->GetValue("name", &nameValue);
MiniPPFile::Values::IntValue* yearValue = nullptr;
result = gameSection->GetValue("year", &yearValue);

// Get a sub-section (section of a section (stated in the MINI file with "[game.window]")
MiniPPFile::Section* windowSection = nullptr;
result = gameSection->GetSubSection("window", &windowSection);

MiniPPFile::Section* windowPlatformSection = nullptr;
// Get a sub-section by using the dot operator
result = gameSection->GetSubSection("window.platform", &windowPlatformSection);

MiniPPFile::Values::ArrayValue* pointsValue = nullptr;
// Retrieve an array by using the relative value path (the game section is a child of the root section)
result = root.GetValue("game.window.platform.targets", &pointsValue);

// Modify the "targets" array by adding a new value
pointsValue->GetValues().push_back(std::make_unique<MiniPPFile::Values::StringValue>("haiku"));

// Serialize the config
result = file.Write("test_out.mini");

return 0;
}
```

## Getting Started

1. **Include minipp**: Add the following line to your file:

```cpp
#define MINIPP_IMPLEMENTATION
#include "minipp.hpp"
```
Note, that you must define MINIPP_IMPLEMENTATION exactly once in your project!

2. **Create a `MiniPPFile` object**:

```cpp
MiniPPFile file;
EResult result = file.Parse("your-file.mini");
```

3. **Parse and access values**:

```cpp
// Access sections
MiniPPFile::Section* gameSection = nullptr;
EResult result = root.GetSubSection("game", &gameSection);

// Access values
MiniPPFile::Values::StringValue* nameValue = nullptr;
result = gameSection->GetValue("name", &nameValue);

// Navigate nested sections

MiniPPFile::Section* windowSection = nullptr;
result = gameSection->GetSubSection("window", &windowSection);

// .. OR ..

MiniPPFile::Section* windowSection = nullptr;
result = root->GetSubSection("game.window", &windowSection);

```
Note, that the root node cannot have values!
Also, arrays are contained in an ArrayValue (container of multiple different Values (may also include other arrays))
```cpp
// Handle arrays
MiniPPFile::Values::ArrayValue* pointsValue = nullptr;
result = root.GetValue("game.window.platform.points", &pointsValue);
// Modify the array values (or read them)
pointsValue->GetValues().push_back(std::make_unique<MiniPPFile::Values::StringValue>("haiku"));
```
5. **Write new files**:

```cpp
result = file.Write("new-file.mini");
```

## Example

An example mini file is contained in this [repository](test.mini). The full mini file format specilization can be found [here](https://github.com/ToyB-Chan/mini-file-format).

## Installation

1. Copy the contents of "minipp.hpp" to a new file in your project.
2. #Include "minipp.hpp" after defining MINIPP_IMPLEMENTATION in one single cpp file.
3. #Include "minipp.hpp" in any other desired files without the IMPLEMENTATION define!

## License

This code is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details.

0 comments on commit 3b7c317

Please sign in to comment.