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