1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use semval::{IntoValidated, Validate, Validated};

pub trait Document: Sized + Validate {
  fn serialize_validated<S: serde::Serializer>(
    validated: Validated<&Self>,
    serializer: S,
  ) -> Result<S::Ok, S::Error>;

  fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
    let validated = self
      .into_validated()
      .map_err(|e| serde::ser::Error::custom(format!("{:?}", e.1)))?;

    Self::serialize_validated(validated, serializer)
  }
}