[][src]Crate serde_dhall

Dhall is a programmable configuration language that provides a non-repetitive alternative to JSON and YAML.

You can think of Dhall as: JSON + types + imports + functions

For a description of the Dhall language, examples, tutorials, and more, see the language website.

This crate provides support for consuming Dhall files the same way you would consume JSON or YAML. It uses the Serde serialization library to provide drop-in support for Dhall for any datatype that supports serde (and that's a lot of them !).

This library is limited to deserializing (reading) Dhall values; serializing (writing) values to Dhall is not supported.

Basic usage

The main entrypoint of this library is the from_str function. It reads a string containing a Dhall expression and deserializes it into any serde-compatible type.

This could mean a common Rust type like HashMap:

use std::collections::HashMap;

// Some Dhall data
let data = "{ x = 1, y = 1 + 1 } : { x: Natural, y: Natural }";

// Deserialize it to a Rust type.
let deserialized_map: HashMap<String, usize> = serde_dhall::from_str(data)?;

let mut expected_map = HashMap::new();
expected_map.insert("x".to_string(), 1);
expected_map.insert("y".to_string(), 2);

assert_eq!(deserialized_map, expected_map);

or a custom datatype, using serde's derive mechanism:

use serde::Deserialize;

#[derive(Debug, Deserialize)]
struct Point {
    x: u64,
    y: u64,
}

// Some Dhall data
let data = "{ x = 1, y = 1 + 1 } : { x: Natural, y: Natural }";

// Convert the Dhall string to a Point.
let point: Point = serde_dhall::from_str(data)?;
assert_eq!(point.x, 1);
assert_eq!(point.y, 2);

Type correspondence

The following Dhall types correspond to the following Rust types:

DhallRust
Boolbool
Naturalu64, u32, ...
Integeri64, i32, ...
Doublef64, f32, ...
TextString
List TVec<T>
Optional TOption<T>
{ x: T, y: U }structs
{ _1: T, _2: U }(T, U), structs
{ x: T, y: T }HashMap<String, T>, structs
< x: T \| y: U >enums
T -> Uunsupported
Prelude.JSON.Typeunsupported
Prelude.Map.Type T Uunsupported

Replacing serde_json or serde_yaml

If you used to consume JSON or YAML, you only need to replace serde_json::from_str or serde_yaml::from_str with serde_dhall::from_str.

Additional Dhall typechecking

When deserializing, normal type checking is done to ensure that the returned value is a valid Dhall value, and that it can be deserialized into the required Rust type. However types are first-class in Dhall, and this library allows you to additionally check that some input data matches a given Dhall type. That way, a type error will be caught on the Dhall side, and have pretty and explicit errors that point to the source file.

There are two ways to typecheck a Dhall value: you can provide the type as Dhall text or you can let Rust infer it for you.

To provide a type written in Dhall, first parse it into a serde_dhall::Value, then pass it to from_str_check_type.

use serde_dhall::Value;
use std::collections::HashMap;

// Parse a Dhall type
let point_type_str = "{ x: Natural, y: Natural }";
let point_type: Value = serde_dhall::from_str(point_type_str)?;

// Some Dhall data
let point_data = "{ x = 1, y = 1 + 1 }";

// Deserialize the data to a Rust type. This checks that
// the data matches the provided type.
let deserialized_map: HashMap<String, usize> =
        serde_dhall::from_str_check_type(point_data, &point_type)?;

let mut expected_map = HashMap::new();
expected_map.insert("x".to_string(), 1);
expected_map.insert("y".to_string(), 2);

assert_eq!(deserialized_map, expected_map);

You can also let Rust infer the appropriate Dhall type, using the StaticType trait.

use serde::Deserialize;
use serde_dhall::StaticType;

#[derive(Debug, Deserialize, StaticType)]
struct Point {
    x: u64,
    y: u64,
}

// Some Dhall data
let data = "{ x = 1, y = 1 + 1 }";

// Convert the Dhall string to a Point.
let point: Point = serde_dhall::from_str_auto_type(data)?;
assert_eq!(point.x, 1);
assert_eq!(point.y, 2);

// Invalid data fails the type validation
let invalid_data = "{ x = 1, z = 0.3 }";
assert!(serde_dhall::from_str_auto_type::<Point>(invalid_data).is_err());

Modules

de

Deserialize Dhall data to a Rust data structure.

Structs

Value

A Dhall value

Traits

StaticType

A Rust type that can be represented as a Dhall type.

Functions

from_str

Deserialize an instance of type T from a string of Dhall text.

from_str_auto_type

Deserialize an instance of type T from a string of Dhall text, additionally checking that it matches the type of T.

from_str_check_type

Deserialize an instance of type T from a string of Dhall text, additionally checking that it matches the supplied type.