signer-daemon 0.2.5

Signer daemon package.
Documentation
use anyhow::bail;
use serde::{Deserialize, Serialize};

use super::deltaobject::DeltaField;
use crate::{SignerDaemon, 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(
    daemon: &SignerDaemon,
    vo: ChatVO,
  ) -> anyhow::Result<Self> {
    Ok(Self {
      chat_key: vo.chat_key(daemon).await?,
      chat_variant: vo.chat_variant(),
      view_object: DeltaField::Set(vo),
    })
  }

  pub async fn new(
    daemon: &SignerDaemon,
    from: &ChatVO,
    to: &ChatVO,
  ) -> anyhow::Result<Self> {
    let from_chat_key = from.chat_key(daemon).await?;
    let to_chat_key = to.chat_key(daemon).await?;

    if from_chat_key != to_chat_key {
      bail!("chat chat_key is not equal")
    }

    let from_chat_variant = from.chat_variant();
    let to_chat_variant = to.chat_variant();
    if from_chat_variant != to_chat_variant {
      bail!("chat chat_variant is not equal")
    }

    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
  }
}