# Cedar Policy Formatter

This package contains a simple formatter library for Cedar policies based on the [`pretty`](https://docs.rs/pretty/latest/pretty/index.html#) crate. We integrate it into [Cedar CLI](../cedar-policy-cli) so that you can format your Cedar policies directly. You can also use it as a library in your Cedar applications.

Please share your opinions about the format using a [feature request](https://github.com/cedar-policy/cedar/issues/new?assignees=&labels=pending-triage&template=feature_request.yml). And report any bugs you find using a [bug report](https://github.com/cedar-policy/cedar/issues/new?assignees=&labels=pending-triage&template=bug_report.yml).

## Quick Start
The easiest way to format your Cedar policies is via [Cedar CLI](../cedar-policy-cli)'s `format` subcommand.

```shell
# Default indentation is two spaces.
# Default line width is 80.
cedar format -p my-policies.cedar
# I want more indentation.
cedar format -i 4 -p my-policies.cedar
# I like shorter lines.
cedar format -l 40 -p my-policies.cedar
```

## Usage

### Build

To build, simply run `cargo build` (or `cargo build --release`).

### Run
The formatter is invoked via [Cedar CLI](../cedar-policy-cli)'s `format` subcommand. Its options can be found using the following command.

```shell
cedar format -h
```

## Documentation

Generated documentation for the latest version can be accessed on
[docs.rs](https://docs.rs/cedar-policy-formatter).

## Testing

Tests for this package use [`insta`](https://insta.rs/) for snapshot testing.
Tests are executed with the usual `cargo test`, but, if your changes introduce
a difference in how we format any of the test policies, the tests will fail,
printing a nicely formatted diff as the error message. You can then run `cargo insta review`
to review how formatting has changed. If the change is expected, accept it
and commit the updated snapshot file. Otherwise, reject the change, and fix it
as you would any other failing test case.

You can add new test cases just just by placing a `.cedar` file in the `tests`
directory. The next run of `cargo test` will fail because there is no snapshot
file. Run `cargo insta review` to review the formatted output for the new
tests. Accept and commit the snapshot if it is correct.
