convo 0.1.2

A modern dialogue executor and tree parser using YAML, focusing on ease-of-use and speed.
Documentation
# Sections
- [Sections]#sections
- [About YAML Format]#about-yaml-format
- [File extension]#file-extension
- [Validation Rules]#validation-rules
  - [Exporting]#exporting
  - [Importing, Parsing]#importing-parsing
- [Examples]#examples
  - [Good Examples]#good-examples
    - [Example 1]#example-1
  - [Bad Examples]#bad-examples
    - [Example 1]#example-1-1
    - [Example 2]#example-2
    - [Example 3]#example-3
    - [Example 4]#example-4
    - [Example 5]#example-5
    - [Example 6]#example-6
    - [Example 7]#example-7

# About YAML Format

YAML (YAML Ain't Markup Language) is a human friendly data format and serialization standard. Read more about YAML format [here](https://yaml.org/).

# File extension

The conventional file extension for convo files is `*.convo.yml`.

# Validation Rules

You can expect an error to be thrown when trying to export or import `*.convo.yml` files if the following validation rules have not been satisfied. You will receive verbose error information on failure, but for comprehension, the rules are listed below in full.

## Exporting
  * The `Tree` must have a root key set
  * The `Tree#nodes` must contain at least 1 node.
  * **Future ([#10]https://github.com/simbleau/convo/issues/10)** : Links must all reference existing nodes.
  * **Future ([#3]https://github.com/simbleau/convo/issues/3)** : All nodes must be reachable; Nodes must be the root element or linked to by a parent.

## Importing, Parsing
  * YAML must contain a top-level element called `root` which is a *string*, which specifies the entry point node key.
  * YAML must contain a top-level element called `nodes` which is a *hash*, which specifies the map of nodes.
  * `nodes` must contain at least 1 node.
  * `nodes` is a *hash*.
  * Node keys are *strings*.
  * Node values are *hashes*.
    * Node must contain a `dialogue` key and/or a `links` key.
    * If node data contains a `dialogue` :
      * node dialogue value is a *string* value.
    * If node data contains a `links` :
      * node link values are *array elements*.
      * node link keys are *strings*.
      * node link values are *strings*.
      * **Future ([#10]https://github.com/simbleau/convo/issues/10)** : Link keys must all reference existing nodes.
  * **Future ([#3]https://github.com/simbleau/convo/issues/3)** : All nodes must be reachable; Nodes must be the root element or linked to by a parent.

# Examples

You can find valid examples in the [dialogue_files](../dialogue_files/) folder.

## Good Examples

### Example 1
```yaml
---
root: start
nodes:
  start:
    dialogue: "Hello, how are you?"
    links:
      - end: "I'm rudely in a hurry."
  end:
    dialogue: "Ok, let's talk some other time."
```

Why is this a **good** example?

The example adheres to [YAML format](#about-yaml-format) and follows [validation rules](#validation-rules).

Namely,
  * YAML contains a top-level element called `root` which specifies the entry point called `start`.
  * YAML contain a top-level element called `nodes`.
  * `nodes` contains at least 1 node (It contains 2).
  * All nodes contain a `dialogue` key.
  * Orphan nodes do not exist (all links can be visited).

## Bad Examples

### Example 1

```yaml
---
nodes:
  root:
    dialogue: "It's a bad day."
```
Why is this a **bad** example?

  * YAML does not contain a top-level element called `root`.

### Example 2

```yaml
---
root: root
nodes:
  start:
    dialogue: "It's a bad day."
```
Why is this a **bad** example?

  * YAML contains a top-level element called `root` which specifies the entry point to be a node called `root`. This will not work because there is only one node called `start`.

### Example 3

```yaml
---
root: start
nodes:
```
Why is this a **bad** example?

  * `nodes` does not contains at least 1 node.
  * `start` does not exist.

### Example 4

```yaml
---
root: start
nodes:
  start:
    links:
      - end: "I'm rudely in a hurry."
  end:
    dialogue: "Ok, let's talk some other time."
```

Why is this a **bad** example?

  * `start` does not contain dialogue.

### Example 5

```yaml
---
root: start
nodes:
  start:
    dialogue: "Hello, how are you?"
  end:
    dialogue: "Ok, let's talk some other time."
```
Why is this a **bad** example?

  * `end` is an orphan node. It is not linked to and therefore not part of the hierarchy.

### Example 6

```yaml
---
root: start
nodes:
  fork:
    dialogue: "I link to all nodes!"
    links:
      - start: "I link to start"
      - end: "I link to end"
      - fork: "I even link to myself!"
  start:
    dialogue: "Hello, how are you?"
  end:
    dialogue: "Ok, let's talk some other time."
```
Why is this a **bad** example?

  * `end` and `fork` are unreachable nodes because the root node is `start`. 

### Example 7

```yaml
---
root: start
nodes:
  start:
    dialogue: "I am the start node"
    links:
      - start: "I am valid and link to myself"
      - not_a_real_key: "I do not link to a valid key"
```
Why is this a **bad** example?

  * `not_a_real_key` is not a node that exists, e.g. invalid reference key.