Aeson Diff
==========

[![Build Status][badge]][status]

This is a small library for working with changes to JSON documents. It includes
a library and two executables in the style of diff(1) and patch(1).

Installing
----------

The `aeson-diff` package is written in Haskell and can be installed using the
Cabal package management tool.

For the command-line tools only, I recommend using Cabal's sandbox
functionality to avoid installing the associated libraries globally on your
system. This approach might look something like the following:

````bash
cd aeson-diff/
cabal sandbox init
cabal install --dependencies-only
cabal build
sudo mkdir -p /usr/local/bin
sudo cp dist/build/json-*/json-{diff,patch} /usr/local/bin/
````

If you want to use the library, use Cabal in a sandbox or not according to your
preference.

````bash
cabal sandbox init
cabal sandbox install ~/Downloads/aeson-diff/
````

Usage
-----

### json-diff command

The `json-diff` command compares two JSON documents and extracts a patch
describing the differences between the first document and the second.

````
Usage: json-diff [-j|--json] [-o|--output OUTPUT] FROM TO
Generate a patch between two JSON documents.

Available options:
    -h,--help                Show this help text
    -j,--json                Output patch in JSON.
````

### json-patch command

The `json-patch` command applies a patch describing changes to be made to
a JSON document.

````
Usage: json-patch [-j|--json] [-o|--output OUTPUT] PATCH FROM
Generate a patch between two JSON documents.

Available options:
  -h,--help                Show this help text
  -j,--json                Patch is in JSON format.
  -o,--output OUTPUT       Destination for patched JSON.
  PATCH                    Patch to apply.
  FROM                     JSON file to patch.
````

### aeson-diff library

The `aeson-diff` library exports as single module: `Data.Aeson.Diff`. This
exports `diff` and `patch` functions which do exactly what might be expected:

- `diff :: Value -> Value -> Patch` examines source and target JSON `Value`s
and constructs a new `Patch` describing the changes.

- `patch :: Patch -> Value -> Value` applies the changes in a `Patch` to a JSON
`Value`.

For more complete information, see the [documentation][docs].

[badge]: https://travis-ci.org/thsutton/aeson-diff.svg?branch=master
[status]: https://travis-ci.org/thsutton/aeson-diff
[docs]: https://hackage.haskell.org/package/aeson-diff/docs/Data-Aeson-Diff.html