use serde::{Deserialize, Serialize};
use super::deltaobject::DeltaField;
use crate::{SignerDaemonCore, model::viewobject::ChatVO};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatDO {
pub chat_key: String,
pub chat_variant: String,
pub view_object: DeltaField<ChatVO>,
}
impl ChatDO {
pub async fn from_vo(core: &SignerDaemonCore, vo: ChatVO) -> crate::DaemonResult<Self> {
Ok(Self {
chat_key: vo.chat_key(core).await?,
chat_variant: vo.chat_variant(),
view_object: DeltaField::Set(vo),
})
}
pub async fn new(
core: &SignerDaemonCore,
from: &ChatVO,
to: &ChatVO,
) -> crate::DaemonResult<Self> {
let from_chat_key = from.chat_key(core).await?;
let to_chat_key = to.chat_key(core).await?;
if from_chat_key != to_chat_key {
return Err(crate::DaemonError::Signer(crate::SignerError::Msg(
"chat chat_key is not equal".to_string(),
)));
}
let from_chat_variant = from.chat_variant();
let to_chat_variant = to.chat_variant();
if from_chat_variant != to_chat_variant {
return Err(crate::DaemonError::Signer(crate::SignerError::Msg(
"chat chat_variant is not equal".to_string(),
)));
}
Ok(Self {
chat_key: from_chat_key,
chat_variant: from_chat_variant,
view_object: DeltaField::new(&from, &to),
})
}
pub fn has_changed(&self, vo: &ChatVO) -> bool {
if let DeltaField::Set(val) = &self.view_object {
if *val != *vo {
return true;
}
}
false
}
}