facet-pretty 0.50.0-rc.2

Pretty-printing for Facet types with syntax highlighting and customizable formatting
Documentation
+++
title = "Pretty-printing"
description = "Render Facet values as readable structured text, including redaction for sensitive fields."
weight = 1
insert_anchor_links = "heading"
+++

`facet-pretty` renders any `Facet` value as readable, structured text without
requiring `Debug`. Reach for it when you want friendly diagnostics, snapshots,
logs, or quick inspection with the same shape information the rest of facet uses.

## Install

Add `facet` and `facet-pretty` to your crate.

## Minimal example

```rust
use facet::Facet;
use facet_pretty::FacetPretty;

#[derive(Facet)]
struct Person {
    name: String,
    age: u32,
}

let person = Person {
    name: "Alice".to_string(),
    age: 30,
};

let rendered = person.pretty().to_string();
assert!(rendered.contains("Person"));
assert!(rendered.contains("Alice"));
```

`.pretty()` returns a `Display` wrapper, so it works anywhere `{}` formatting
does: diagnostics, tracing fields, test output, or a tiny debug view.

## Redaction

Mark a field `#[facet(sensitive)]` and `facet-pretty` replaces its value with
`[REDACTED]` while keeping the field name visible:

```rust
use facet::Facet;
use facet_pretty::FacetPretty;

#[derive(Facet)]
struct Config {
    host: String,

    #[facet(sensitive)]
    api_key: String,
}

let config = Config {
    host: "example.com".to_string(),
    api_key: "secret".to_string(),
};

let rendered = config.pretty().to_string();
assert!(rendered.contains("api_key"));
assert!(rendered.contains("[REDACTED]"));
assert!(!rendered.contains("secret"));
```

That makes it a good fit for operational output where secrets must never take a
surprise stroll through the logs.

## Custom output

Use `PrettyPrinter` when you want explicit formatting settings:

```rust
use facet::Facet;
use facet_pretty::{FacetPretty, PrettyPrinter};

#[derive(Facet)]
struct Point {
    x: i32,
    y: i32,
}

let point = Point { x: 1, y: 2 };
let printer = PrettyPrinter::new().with_indent_size(4);

let rendered = point.pretty_with(printer).to_string();
assert!(rendered.contains("Point"));
```

`PrettyPrinter::format(&value)` is available too, if you prefer asking the
printer for a `String` directly.

## Related

- [facet-error]/facet-error/guide/ — derive displayable error types from doc comments
- [facet-json]/facet-json/guide/ — serialize the same values as JSON
- [facet-validate]/facet-validate/guide/ — reject invalid values before printing them
- [Ecosystem]/ecosystem/ — diagnostics, derive plugins, and format crates