I want to build a small gui application in rust. What are my options for application storage? I have heard of the confi crate but I want to save a bit more than just configuration. Is there a crate that handles this for me easily?
Be sure to treat state and configuration separately. It doesn’t matter on Windows as far as I know (they go in the same location), but on Linux those are supposed to go in different places.
Many programs get this wrong, and it is quite annoying as I track my config files in git. I don’t want a diff just because the list of recently opened files changed! Or even worse: the program stores the last window size and position in the config file… (looking at you KDE!)
Here are some libraries I found to help with this in a cross platform way:
I haven’t tried either, haven’t written such a program yet.
As for how to store data, there are indeed many options, depending on your needs:
- Plain text based formats (toml, yaml, JSON, ini, …) can be good for configs and basic state. As a bonus it let’s the user easily manage the file in version control if they are so inclined.
- Databases (SQLite mostly)
- Custom formats (binary files in a directory structure is often used for browser caches for example) .
Without knowing more it is hard to give specific advise.
Thanks for the link to “dirs” - I wish I’d known about it before I implemented a (worse) version just using the home crate.
For Linux, here is the spec: https://specifications.freedesktop.org/basedir-spec/basedir-spec-0.6.html
macOS has the NSSearchPathForDirectoriesInDomains API.
For Windows, there’s also an API for that, but I don’t know it offhand.
It depends on how you want to store your data. Every OS has a standard for where applications should store their data. You should store your data at the appropriate path. If you have structured data against which you want to run queries you could use a sqlite DB (the sqlx crate supports sqlite) instead of just a bunch of config files.