ankurah_core/property/
traits.rs

1use anyhow::Result;
2
3use crate::{entity::Entity, error::RetrievalError, property::PropertyName, value::CastError};
4
5use thiserror::Error;
6
7use super::Value;
8
9pub trait InitializeWith<T> {
10    fn initialize_with(entity: &Entity, property_name: PropertyName, value: &T) -> Self;
11}
12
13#[derive(Error, Debug)]
14pub enum PropertyError {
15    #[error("property is missing")]
16    Missing,
17
18    // #[error("property is missing: {name} in collection: {collection}")]
19    // NotFoundInBackend { backend: &'static str, name: PropertyName },
20    #[error("serialization error: {0}")]
21    SerializeError(Box<dyn std::error::Error + Send + Sync>),
22    #[error("deserialization error: {0}")]
23    DeserializeError(Box<dyn std::error::Error + Send + Sync + 'static>),
24    #[error("retrieval error: {0}")]
25    RetrievalError(crate::error::RetrievalError),
26    #[error("invalid variant `{given}` for `{ty}`")]
27    InvalidVariant { given: Value, ty: String },
28    #[error("invalid value `{value}` for `{ty}`")]
29    InvalidValue { value: String, ty: String },
30    #[error("transaction is no longer alive")]
31    TransactionClosed,
32
33    #[error("cast error: {0}")]
34    CastError(CastError),
35}
36
37impl PartialEq for PropertyError {
38    fn eq(&self, other: &Self) -> bool { self.to_string() == other.to_string() }
39}
40
41impl From<PropertyError> for std::fmt::Error {
42    fn from(_: PropertyError) -> std::fmt::Error { std::fmt::Error }
43}
44
45#[cfg(feature = "wasm")]
46impl From<PropertyError> for wasm_bindgen::JsValue {
47    fn from(val: PropertyError) -> Self { wasm_bindgen::JsValue::from_str(&val.to_string()) }
48}
49
50impl From<RetrievalError> for PropertyError {
51    fn from(retrieval: RetrievalError) -> Self { PropertyError::RetrievalError(retrieval) }
52}
53
54pub trait FromEntity {
55    fn from_entity(property_name: PropertyName, entity: &Entity) -> Self;
56}
57
58pub trait FromActiveType<A> {
59    fn from_active(active: A) -> Result<Self, PropertyError>
60    where Self: Sized;
61}
62
63/*
64impl<A, T> FromActiveType<A> for Option<T>
65where T: FromActiveType<A> {
66    fn from_active(active: Result<A, PropertyError>) -> Result<Option<T>, PropertyError> {
67        match T::from_active(active) {
68            Ok(projected) => {
69                Ok(Some(projected))
70            }
71            Err(PropertyError::Missing) => Ok(None),
72            Err(err) => Err(err),
73        }
74    }
75}
76*/