Skip to main content

whisky_common/data/primitives/
boolean.rs

1use crate::{data::{constr0, constr1, PlutusDataJson}, WError};
2use serde_json::{json, Value};
3
4#[derive(Clone, Debug, PartialEq)]
5pub enum Bool {
6    True,
7    False,
8}
9
10impl Bool {
11    pub fn new(b: bool) -> Self {
12        if b {
13            Bool::True
14        } else {
15            Bool::False
16        }
17    }
18}
19
20impl PlutusDataJson for Bool {
21    fn to_json(&self) -> serde_json::Value {
22        match self {
23            Bool::True => constr1(json!([])),
24            Bool::False => constr0(json!([])),
25        }
26    }
27
28    fn from_json(value: &Value) -> Result<Self, WError> {
29        let constructor = value
30            .get("constructor")
31            .ok_or_else(|| WError::new("Bool::from_json", "missing 'constructor' field"))?
32            .as_u64()
33            .ok_or_else(|| WError::new("Bool::from_json", "invalid 'constructor' value"))?;
34
35        match constructor {
36            0 => Ok(Bool::False),
37            1 => Ok(Bool::True),
38            _ => Err(WError::new(
39                "Bool::from_json",
40                &format!("invalid constructor tag for Bool: {}", constructor),
41            )),
42        }
43    }
44}
45
46pub fn bool(b: bool) -> Value {
47    if b {
48        constr1(json!([]))
49    } else {
50        constr0(json!([]))
51    }
52}