pub struct LabeledBlock<T>(/* private fields */);
Expand description
A transparent wrapper type which hints the Serializer
to serialize
T
as a labeled HCL block.
When passed to a serializer other than the one from this crate, a LabeledBlock<T>
serializes
exactly like T
, if T
implements serde::Serialize
.
A LabeledBlock<T>
can only be used in the value position of a map-like structure. For example:
- It can be used to wrap the value type of a map, e.g.
Map<K, LabeledBlock<T>>
- As the value of a struct field, e.g.
struct S { field: LabeledBlock<T> }
- Or as the value of an enum variant, e.g.
enum E { Variant(LabeledBlock<T>) }
The serialized block’s identifier will be the respective map key, struct field name or variant name.
The wrapped T
must be shaped as follows to be serialized as a labeled HCL block:
- A map-like value (e.g. a map or struct) where the value may to be another
LabeledBlock<T>
, in which case a block with multiple labels is produced. Can be nested arbitrarily deep to allow for any number of block labels. - A sequence-like value (e.g. a vector, slice or tuple) with map-like elements as described above. In this case, multiple blocks with the same identifier and labels are produced.
Wrapping a type T
that does not fulfil one of the criteria above in a LabeledBlock<T>
will result in serialization errors.
For more convenient usage, see the labeled_block
and doubly_labeled_block
functions.
§Example
use hcl::ser::LabeledBlock;
use indexmap::{indexmap, IndexMap};
use serde::Serialize;
#[derive(Serialize)]
struct Config {
user: LabeledBlock<IndexMap<String, User>>,
}
#[derive(Serialize)]
struct User {
email: String,
}
let users = indexmap! {
"john".into() => User {
email: "johndoe@example.com".into(),
},
"jane".into() => User {
email: "janedoe@example.com".into(),
},
};
let config = Config {
user: LabeledBlock::new(users),
};
let expected = r#"
user "john" {
email = "johndoe@example.com"
}
user "jane" {
email = "janedoe@example.com"
}
"#.trim_start();
assert_eq!(hcl::to_string(&config)?, expected);
Implementations§
Source§impl<T> LabeledBlock<T>
impl<T> LabeledBlock<T>
Sourcepub fn new(value: T) -> LabeledBlock<T>
pub fn new(value: T) -> LabeledBlock<T>
Create a new LabeledBlock<T>
from a T
.
Sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
Consume the LabeledBlock
and return the wrapped T
.