serde-select
Finally, I managed to implement a proof of concept of serde-select. But lets start at the beginning.
The Problem
The problem I tried to solve with this crate is rather simple: You need to be able to get values from a serde-compatible document (e.g. toml, json, yaml, ...) but you don't know the full schema of the document at compiletime of your crate.
The origin of the idea of serde-select was when I first started working on my imag project, where a lot of seperated crates coexist in one ecosystem, but all of them should be configured in one big configuration file. Of course I did not want to have one central crate just for defining the schema, especially since a user might not want to use all functionality from the ecosystem, thus not having a “full” configuration file, but only the parts they needed.
So I started writing “toml-query”, a crate which lets the programmer query a
toml::Value
with a “path”. For example:
[calendar]
list_format = "{{lpad 5 i}} | {{abbrev 5 uid}} | {{summary}} | {{location}}"
show_format = """
{{i}} - {{uid}}
"""
[ref]
[ref.basepathes]
music = "/home/user/music"
contacts = "/home/user/contacts"
calendars = "/home/user/calendars"
The document looks like this, but in the program code we only need calendar
and its sub-values. So we can do
let r = document.read("calendar.list_format");
in the code and get a Result<Option<&'document Value>>
value back.
toml-query evolved over the time, now featuring more flexibility by
implementing “Partials”, how I call them. These are structs that are
Serialize + Deserialize
and have a path attached to them, so deserializing the
partial document is possible right away:
let r: Result<Option<CalendarConfig>, _> = document.read_partial::<CalendarConfig>();
where CalendarConfig: Serialize + Deserialize + Debug + toml_query::Partial
(see here).
The evolution
toml-query works perfectly fine and I use it in my other projects a lot. It is fast and easy to use. Its error reporting is nice.
But an idea formed in the back of my head and I did not stop to think about it.
Can toml-query by generalized to work with all formats serde can handle?
So I started to experiement with a more general implementation: serde-select was born.
And today I managed to get the first bits working.
Meet serde-select
serde-select implements a “read” functionality for both JSON and TOML, depending on what features you enable. The inner implementation of the resolve-algorithm is agnostic of the actual format.
For a quick overview how to use the crate right now, have a look at the tests for toml for example.
I strongly advice against using this crate, though. It is only an experiement for now and shouldn't be used in production code. Nevertheless, I published the first preview on crates.io.
tags: #rust #programming