# Examples
Here is an example that shows some of `derail`'s functionality:
```rust
use std::{io, iter};
use derail::CoreCompat;
use derail_macros::Error;
use derail_report::{HeapFactory, multiline};
#[derive(Debug, Error)]
#[derail(type Details = ())]
enum ConfigError {
#[derail(display("failed to parse configuration"))]
Parse,
#[derail(display("failed to validate configuration"))]
Validate(#[derail(children)] Vec<ValidationError>),
}
#[derive(Debug, Error)]
#[derail(type Details = ())]
enum ValidationError {
#[derail(display("{_0}"))]
Simple(&'static str),
#[derail(display("failed to read imported configuration file"))]
Import(#[derail(child)] CoreCompat<io::Error>),
}
let error = ConfigError::Validate(vec![
ValidationError::Simple("number out of bounds for option A"),
ValidationError::Import(CoreCompat(io::ErrorKind::NotFound.into())),
ValidationError::Simple("string not long enough for option B"),
]);
let actual = format!(
"Errors:\n{}\n",
multiline::<_, _, HeapFactory>(iter::once(&error)),
);
let expected = indoc::indoc! {"
Errors:
╰─► failed to validate configuration
├─► number out of bounds for option A
├─► failed to read imported configuration file
│ ╰─► entity not found
╰─► string not long enough for option B
"};
assert_eq!(expected, actual);
```