Перейти к содержимому

Установка

[dependencies]
amethystate = { version = "0.26", features = ["redb"] }

Движка по умолчанию нет. Приложение само называет тот, что будет держать его файл, а крейт, который только объявляет структуры или служит адаптером к фреймворку, не называет никакого и оставляет выбор приложению. Всё ниже — про то, какой назвать.

Движков шесть, и каждый store держит ровно один из них. Фичи Cargo решают, какие из шести вообще войдут в сборку; какой возьмётся за store — говорят при открытии, через StoreBuilder::backend. Если не сказать, берётся первый включённый.

feature движок где лежит
redb redb файл .redb
sqlite SQLite файл .db
json JSON файл .json
toml TOML файл .toml
ron RON файл .ron
localstorage localStorage браузера ключи под amethystate.<имя store>. на странице

Текстовые движки пишут два файла: данные и файл-спутник .meta. В спутнике лежит то, без чего store не прочитает данные обратно: какая версия каждой структуры их записала, как выглядели её поля и что уже сделал проход миграции. Файл данных человек по-прежнему прочитает и сам по себе, но открытый без спутника он теряет схему, под которой записан. Поэтому файлы принадлежат друг другу, и резервная копия берёт оба. redb и SQLite держат ту же запись внутри своего единственного файла.

Формат задаёт, что store может выразить. В Выборе движка измерено, что каждый движок делает с одними и теми же значениями.

Сборка без движка всё равно компилируется, но store в ней не откроется: StoreBuilder::build ответит OpenStore::WouldNotOpen и назовёт фичи, которые надо включить.

Фича memory добавляет ещё один движок — вовсе без файла. Сам он store не берёт никогда: его просят по имени, или он встаёт на место файла, который не открылся, — см. Открытие store.

У страницы, собранной под wasm32-unknown-unknown, файлов нет, и движок для неё — фича localstorage: localStorage браузера, по значению JSON на ключ, и всё это видно в инструментах разработчика. Запись ложится сразу, в том же вызове, без дебаунса, а переполненная квота приходит ошибкой этого set. Запись из другой вкладки приходит как изменение со стороны — так же, как правка файла текстового движка. Где угодно, кроме страницы, store не откроется.

amethystate = { version = "0.26", features = ["localstorage"] }

Фичи Cargo аддитивны. Если в сборке несколько движков, store, которому движок не назвали, берёт тот, что раньше в списке redb, SQLite, JSON, TOML, RON, localStorage. Так что стоит какой-нибудь зависимости включить redb, и за такой store возьмётся redb, что бы ни просил ваш крейт.

Скомпилировать сразу несколько - законно: инструмент, который читает тот файл, на который его направили, или набор тестов, прогоняющий один и тот же случай по каждому. Назовите движок явно при создании store, и этот порядок перестаёт что-либо значить.

SQLite собирается из исходников, поэтому нужен C-тулчейн. Зато минимальную версию SQLite выбирает библиотека, а не дистрибутив пользователя.

Разница не косметическая. Стоит начать пользоваться какой-нибудь возможностью SQLite — скажем, STRICT-таблицами, — и минимум прыгает до 3.37. В самом файле это никак не отмечено, поэтому SQLite постарее скажет не «версия не та», а «схема испорчена» — про целый и невредимый файл.

amethystate = { version = "0.26", features = ["sqlite"] }

См. Переход со своего решения.

Таймер guinea, период которого следует за сохранённой настройкой: см. guinea.