itf/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#![doc = include_str!("../README.md")]

use serde::de::DeserializeOwned;
use serde::Deserialize;

pub mod de;
pub mod error;
pub mod runner;
pub mod state;
pub mod trace;

pub use error::Error;
pub use runner::Runner;
pub use state::State;
pub use trace::Trace;

#[doc(hidden)]
pub mod value;

#[doc(hidden)]
pub use value::Value;

/// Deserialize a [`Trace`] over states `S` from an ITF JSON string.
pub fn trace_from_str<S>(str: &str) -> Result<Trace<S>, Error>
where
    S: for<'de> Deserialize<'de>,
{
    let trace_value: Trace<Value> = serde_json::from_str(str)?;
    trace_value.decode()
}

/// Deserialize a [`Trace`] over states `S` from an ITF JSON [`serde_json::Value`].
pub fn trace_from_value<S>(value: serde_json::Value) -> Result<Trace<S>, Error>
where
    S: DeserializeOwned,
{
    let trace_value: Trace<Value> = serde_json::from_value(value)?;
    trace_value.decode()
}

/// Deserialize an ITF-encoded expression `S` from an ITF JSON string.
pub fn from_str<S>(str: &str) -> Result<S, Error>
where
    S: for<'de> Deserialize<'de>,
{
    let value: Value = serde_json::from_str(str)?;
    let data = S::deserialize(value)?;
    Ok(data)
}

/// Deserialize an ITF-encoded expression `S` from an ITF JSON [`serde_json::Value`].
pub fn from_value<S>(value: serde_json::Value) -> Result<S, Error>
where
    S: DeserializeOwned,
{
    let trace_value: Value = serde_json::from_value(value)?;
    let s = S::deserialize(trace_value)?;
    Ok(s)
}