# Style Guide

In order to make LinuxGSM as coherent as possible, we adopted some code conventions to follow.\
Here are some of them.

## Variables

#### Naming variables

Variables should be made of lowercase letters only and should be descriptive enough to understand its purpose (even if the variable is longer that preferred).

### Defining variables

Any variable should be defined through double quotes

```bash
var="value"
```

### Calling variables

Variable should always be called between brackets and double quotes to prevent globbing and word splitting.

```bash
echo "${var}"
```

### Directories

Directories are called using LinuxGSM directories variables, or relative to those. Common directory variables can be found in `linuxgsm.sh` and `_default.cfg` .

Examples:

```bash
mkdir -pv "${servercfgdir}"
mkdir -pv "${lgsmdir}/config-default/config-game"
du -sh "${rootdir}" 2> /dev/null
find "${executabledir}/bin"
```

## `if` Statements

If statements should look like the following

```
if [ "${shortname}" == "csgo" ];then
   # content
fi
```

if statements with multiple options like so

```
if [ "${shortname}" == "csgo" ]||[ "${shortname}" == "css" ]; then
   # content
fi
```

## Conditional checks

### Syntax

* The `if [ statement ]; then` should be a one-liner operation.
* Signs comparators like `==`, `lt`, `lt` etc. are preferred to `-eq`, `-le`, `-lt`.
* Anything within an if statement must be tabulated one step deeper.

Example:

```bash
if [ "${test}" == "${var}" ]; then
    mycheck="true"
fi
```

### Expression Standards

Common if expressions LinuxGSM uses. More expressions [here](http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html).

| Expression | Description                          |
| ---------- | ------------------------------------ |
| `-d`       | if directory exists                  |
| `! -d`     | if directory does not exist          |
| `-f`       | if file exists                       |
| `! -f`     | if file does not exist               |
| `-z`       | true if length of string is zero     |
| `-n`       | true if length of string is non-zero |
| `-v`       | true if the variable exists          |

{% hint style="danger" %}
Do not use `! -z` or `! -n`
{% endhint %}

There is a distinct difference between -n and -v.

-n is used to check is a variable is set and not if it exists\
-v is used to check if a variable exists and not it is set

```bash
var="set"
if [ -n "${var}" ]; then
 # Variable is set
fi
```

```bash
var=""
if [ -z "${var}" ]; then
 # Variable is not set
fi
```

```
var=""
# OR
var="set"
if [ -v var ]; then
 # Variable exista
fi
```

```
# var is missing
if [ ! -v var ]; then
 # Variable does not exist
fi
```

## Loops

* Loops should be a one liner statement.
* Anything within a loop must be tabulated one step deeper.

```bash
while [ "${var}" < "${cap}" ]; do
    echo "This is tabulated"
    let var=var+1
done
```

## Comments

As English is not always the native language of a developer, comments should use a formal writing style and be straight to the point. If unsure this short formal writing [guide](http://www2.ivcc.edu/rambo/tip_formal_writing_voice.htm) will help.

```bash
# Using comments help developers understand complex code, but should be used sparingly.
```

## Functions

* Function should be named starting with `fn_` and using lowercase letters only.
* Any recurrent task should be put into a function.
* Anything within a function must be tabulated one step deeper.

Example:

```bash
fn_myfunction(){
    echo "This is tabulated"
}
```

## Messages

* Messages should be given using core\_messages.sh forms
* Additional information messages are given in the form of `echo -e " * Message here"`

## Automated Messages

Automated messages are used with any commands that are non-interactive. Examples of this include Start, Stop and Monitor. There are various different alert messages available see [Exit-Codes](broken://pages/-Lgn9gyZzujsevVI68ug) for details.

Each automated message starts with `fn_print_dots` to show a process is happening but with no known outcome.

`fn_print_dots`

```
[ .... ] Starting fctrserver:
```

Once an outcome of a process is known the message uses an outcome message like `fn_print_ok` or `fn_print_fail`

fn\_print\_ok

```
[  OK  ] Starting fctrserver: Factorio Server
```

The option of a newline is also available by appending `_nl` for example `fn_print_ok_nl`. This will add a carriage return to the message preventing it being overwritten by the next message.

```
[  OK  ] Stopping fctrserver: Graceful: CTRL+c: 2: OK
[ .... ] Starting fctrserver: Factorio Server
```

#### Characteristics

Interactive messages contain extra detail at the begining of the message that is pre-populated. Full stops must `not` be used with this type of message.

### Interactive Messages

Interactive messages are used with any commands that have interactive elements. Examples of this include Install, console and debug. There are various different alert messages available see \[\[Exit-Codes]] for details.

```
Warning! If fctrserver is already running it will be stopped.
```

standard echo commands are normally used to supplement an alert or if an alert is not required. Bullet points can also be used

```
Information! Press "CTRL+b" then "d" to exit console.
Warning! Do NOT press CTRL+c to exit.
* https://docs.linuxgsm.com/commands/console
```

#### Characteristics

Treat interactive messages as a standard sentence. All messages must begin with a capital and end with a full stop


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dev-docs.linuxgsm.com/code-standards/style-guide.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
