Crate json_str [] [src]

Json String Literal Generator

Write json with Rust syntax instead of hard to read inline strings. This crate doesn't evaluate any expressions, it just converts a Rust token tree into a minified json string.

Usage

This crate is on crates.io.

There are two ways to reference json_str in your projects, depending on whether you're on the stable/beta or nightly channels.

Stable

To get started, add json_str to your Cargo.toml:

This example is not tested
[dependencies]
json_str = "*"

And reference it in your crate root:

This example is not tested
#[macro_use]
extern crate json_str;

Nightly

To get started, add json_str to your Cargo.toml:

This example is not tested
[dependencies]
json_str = { version = "*", features = "nightly" }

And reference it in your crate root:

This example is not tested
#![feature(plugin)]
#![plugin(json_str)]

If you're on the nightly channel, it's better to use the above plugin version with the nightly feature because the conversion and sanitisation takes place at compile-time instead of runtime, saving precious runtime cycles.

Examples

Literals

The json_str! macro will take an inline token tree and return a sanitised json String:

This example is not tested
let json = json_str!({
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "geo_distance": {
                    "distance": "20km",
                    "location": {
                        "lat": 37.776,
                        "lon": -122.41
                    }
                }
            }
        }
    }
});

This will also work for unquoted keys for something a bit more rusty:

This example is not tested
let json = json_str!({
    query: {
        filtered: {
            query: {
                match_all: {}
            },
            filter: {
                geo_distance: {
                    distance: "20km",
                    location: {
                        lat: 37.776,
                        lon: -122.41
                    }
                }
            }
        }
    }
});

On nightly, there's an additional plugin called json_lit that returns a &'static str instead of a String, so you can avoid allocating each time. The syntax is otherwise the same as json_str:

This example is not tested
let json = json_lit!({
    query: {
        filtered: {
            query: {
                match_all: {}
            },
            filter: {
                geo_distance: {
                    distance: "20km",
                    location: {
                        lat: 37.776,
                        lon: -122.41
                    }
                }
            }
        }
    }
});

Replacement values

The json_fn macro will convert a set of replacement tokens and token tree and returns a lambda function that substitutes them:

This example is not tested
// Declares an inline Fn(&str, &str, &str) -> String
let f = json_fn!(|dst, lat, lon| {
    query: {
        filtered: {
            query: {
                match_all: {}
            },
            filter: {
                geo_distance: {
                    distance: $dst,
                    location: {
                        lat: $lat,
                        lon: $lon
                    }
                }
            }
        }
    }
});
 
// Call the lambda and return the substituted json
let json = f("\"20km\"", "37.776", "-122.41");

All input arguments are a &str, and the output is a String. Only simple variable substitution is supported, no repeating or sanitisation of the replacement values.

Modules

parse

Raw parsers for sanitising a stream of json.

Macros

json_fn
json_str