> ## Documentation Index
> Fetch the complete documentation index at: https://cs-lua.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# store — datafile

> Чтение и запись `.lua`-файлов. Формат читаемый и правится руками, поэтому

# datafile

Чтение и запись `.lua`-файлов. Формат читаемый и правится руками, поэтому
подходит для того, что редактирует человек: список админов, набор префиксов,
сток магазина. Им же ядро хранит `data/users.lua`.

**Запись атомарна.** Новое содержимое пишется в `.tmp`, старый файл переезжает в
`.bak`, и только потом `.tmp` встаёт на место. **Вывод детерминированный:** ключи
сортируются, две записи одних и тех же данных дают побайтово одинаковый файл.

<h2 id="at">
  datafile.at
</h2>

Привязывает модуль к своему каталогу.

```lua theme={null}
datafile.at(dir)
```

### Аргументы

| # | имя   | тип    |                      |
| - | ----- | ------ | -------------------- |
| 1 | `dir` | string | существующий каталог |

### Возвращает

| тип     |                                          |
| ------- | ---------------------------------------- |
| `table` | тот же набор функций, но в этом каталоге |

### Пример

```lua theme={null}
local files = require("datafile").at(plugin.data_dir())
```

Без `at()` функции работают в общем `addons/lua/data/`, где лежит `users.lua` ядра.

<h2 id="load">
  datafile.load
</h2>

Читает таблицу из `<dir>/<name>.lua`.

```lua theme={null}
datafile.load(name[, fallback])
```

### Аргументы

| # | имя        | тип    |                             |
| - | ---------- | ------ | --------------------------- |
| 1 | `name`     | string | имя файла без расширения    |
| 2 | `fallback` | any    | что вернуть, если файла нет |

### Возвращает

| тип      |                          |
| -------- | ------------------------ |
| `table`  | содержимое файла         |
| `string` | причина, если файл битый |

Отсутствие файла — не ошибка: на свежем сервере данных ещё нет. Битый файл — ошибка, и она возвращается вторым значением.

<Note>
  Файл выполняется в пустом окружении: ни `io`, ни `os`, ни `print`.
  Всё, кроме возвращённой таблицы, — ошибка.
</Note>

<h2 id="save">
  datafile.save
</h2>

Пишет таблицу в `<dir>/<name>.lua`.

```lua theme={null}
datafile.save(name, t[, header])
```

### Аргументы

| # | имя      | тип           |                            |
| - | -------- | ------------- | -------------------------- |
| 1 | `name`   | string        | имя файла без расширения   |
| 2 | `t`      | table         | что записать               |
| 3 | `header` | string \| nil | комментарий первой строкой |

### Возвращает

| тип       |                    |
| --------- | ------------------ |
| `boolean` | `true` при успехе  |
| `string`  | причина при ошибке |

<h2 id="serialize">
  datafile.serialize
</h2>

Превращает таблицу в текст, без записи.

```lua theme={null}
datafile.serialize(t)
```

### Аргументы

| # | имя | тип   |                   |
| - | --- | ----- | ----------------- |
| 1 | `t` | table | что сериализовать |

### Возвращает

| тип      |             |
| -------- | ----------- |
| `string` | Lua-литерал |

<h2 id="dir">
  datafile.dir
</h2>

Каталог, к которому привязан модуль.

```lua theme={null}
datafile.dir()
```

### Возвращает

| тип      |                 |
| -------- | --------------- |
| `string` | абсолютный путь |
