signer-crdt 0.4.1

Signer CRDT (Conflict-free Replicated Data Type) package.
Documentation
use serde::{Deserialize, Serialize};

use crate::{view::UserVO, DeltaError};

use super::deltaobject::DeltaField;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserDO {
    pub pub_key: String,
    pub user_public: DeltaField<String>,
    pub signed_user_public: DeltaField<String>,
}

impl UserDO {
    pub fn new(from: &UserVO, to: &UserVO) -> Result<Self, DeltaError> {
        if from.pub_key != to.pub_key {
            return Err(DeltaError::InvalidParamsError(
                "user primary key not equal".to_string(),
            ));
        }

        Ok(Self {
            pub_key: from.pub_key.clone(),
            user_public: DeltaField::new(&from.user_public, &to.user_public),
            signed_user_public: DeltaField::new(&from.signed_user_public, &to.signed_user_public),
        })
    }

    pub fn has_changed(&self, vo: &UserVO) -> bool {
        if let DeltaField::Set(val) = &self.user_public {
            if *val != vo.user_public {
                return true;
            }
        }
        if let DeltaField::Set(val) = &self.signed_user_public {
            if *val != vo.signed_user_public {
                return true;
            }
        }

        false
    }
}

impl From<UserVO> for UserDO {
    fn from(value: UserVO) -> Self {
        Self {
            pub_key: value.pub_key,
            user_public: DeltaField::Set(value.user_public),
            signed_user_public: DeltaField::Set(value.signed_user_public),
        }
    }
}