use serde::{Deserialize, Serialize};
use super::contract_type::ContractType;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PropSchema {
required: bool,
#[serde(rename = "type")]
ty: ContractType,
}
impl PropSchema {
pub(super) fn required(ty: ContractType) -> Self {
Self { required: true, ty }
}
pub(super) fn optional(ty: ContractType) -> Self {
Self {
required: false,
ty,
}
}
#[must_use]
pub fn is_required(&self) -> bool {
self.required
}
#[must_use]
pub fn ty(&self) -> &ContractType {
&self.ty
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn required_and_optional_differ_only_in_requiredness() {
let required = PropSchema::required(ContractType::string());
let optional = PropSchema::optional(ContractType::string());
assert!(required.is_required());
assert!(!optional.is_required());
assert_eq!(required.ty(), optional.ty());
}
#[test]
fn serializes_the_type_under_a_type_key() {
let json = serde_json::to_value(PropSchema::required(ContractType::boolean())).unwrap();
assert_eq!(json["required"], true);
assert_eq!(json["type"]["kind"], "boolean");
}
}