pub struct Block<T>(/* private fields */);
Expand description
A transparent wrapper type which hints the Serializer
to serialize
T
as an HCL block.
When passed to a serializer other than the one from this crate, a Block<T>
serializes
exactly like T
, if T
implements serde::Serialize
.
A Block<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, Block<T>>
- As the value of a struct field, e.g.
struct S { field: Block<T> }
- Or as the value of an enum variant, e.g.
enum E { Variant(Block<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 an HCL block:
- A map-like value (e.g. a map or struct).
- 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 are produced.
Wrapping a type T
that does not fulfil one of the criteria above in a Block<T>
will result
in serialization errors.
For more convenient usage, see the block
function.
§Example
use hcl::ser::Block;
use serde::Serialize;
#[derive(Serialize)]
struct Config {
user: Block<Vec<User>>,
}
#[derive(Serialize)]
struct User {
name: String,
email: String,
}
let users = vec![
User {
name: "john".into(),
email: "johndoe@example.com".into(),
},
User {
name: "jane".into(),
email: "janedoe@example.com".into(),
},
];
let config = Config {
user: Block::new(users),
};
let expected = r#"
user {
name = "john"
email = "johndoe@example.com"
}
user {
name = "jane"
email = "janedoe@example.com"
}
"#.trim_start();
assert_eq!(hcl::to_string(&config)?, expected);
Implementations§
Trait Implementations§
Source§impl<'de, T> Deserialize<'de> for Block<T>where
T: Deserialize<'de>,
impl<'de, T> Deserialize<'de> for Block<T>where
T: Deserialize<'de>,
Source§fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Auto Trait Implementations§
impl<T> Freeze for Block<T>where
T: Freeze,
impl<T> RefUnwindSafe for Block<T>where
T: RefUnwindSafe,
impl<T> Send for Block<T>where
T: Send,
impl<T> Sync for Block<T>where
T: Sync,
impl<T> Unpin for Block<T>where
T: Unpin,
impl<T> UnwindSafe for Block<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more