holochain_types/
warrant.rs

1//! Defines the Warrant variant of DhtOp
2
3use std::str::FromStr;
4
5use holochain_keystore::{AgentPubKeyExt, LairResult, MetaLairClient};
6use holochain_zome_types::prelude::*;
7
8/// A Warrant DhtOp
9#[derive(
10    Clone,
11    Debug,
12    Serialize,
13    Deserialize,
14    SerializedBytes,
15    Eq,
16    PartialEq,
17    Hash,
18    derive_more::From,
19    derive_more::Deref,
20)]
21pub struct WarrantOp(SignedWarrant);
22
23impl WarrantOp {
24    /// Get the type of warrant
25    pub fn get_type(&self) -> WarrantOpType {
26        match self.proof {
27            WarrantProof::ChainIntegrity(_) => WarrantOpType::ChainIntegrityWarrant,
28        }
29    }
30
31    /// Sign the warrant for use as an Op
32    pub async fn sign(keystore: &MetaLairClient, warrant: Warrant) -> LairResult<Self> {
33        let signature = warrant.author.sign(keystore, warrant.clone()).await?;
34        Ok(Self::from(SignedWarrant::new(warrant, signature)))
35    }
36
37    /// Accessor for the timestamp of the warrant
38    pub fn timestamp(&self) -> Timestamp {
39        self.timestamp
40    }
41
42    /// Accessor for the warrant
43    pub fn warrant(&self) -> &Warrant {
44        self
45    }
46
47    /// Accessor for the warrant
48    pub fn into_warrant(self) -> Warrant {
49        self.0.into_data()
50    }
51}
52
53/// Different types of warrants
54#[derive(
55    Clone,
56    Copy,
57    Debug,
58    Serialize,
59    Deserialize,
60    Eq,
61    PartialEq,
62    Hash,
63    derive_more::Display,
64    strum_macros::EnumString,
65)]
66pub enum WarrantOpType {
67    /// A chain integrity warrant
68    ChainIntegrityWarrant,
69}
70
71impl HashableContent for WarrantOp {
72    type HashType = hash_type::DhtOp;
73
74    fn hash_type(&self) -> Self::HashType {
75        hash_type::DhtOp
76    }
77
78    fn hashable_content(&self) -> HashableContentBytes {
79        self.warrant().hashable_content()
80    }
81}
82
83impl holochain_sqlite::rusqlite::ToSql for WarrantOpType {
84    fn to_sql(
85        &self,
86    ) -> holochain_sqlite::rusqlite::Result<holochain_sqlite::rusqlite::types::ToSqlOutput> {
87        Ok(holochain_sqlite::rusqlite::types::ToSqlOutput::Owned(
88            format!("{}", self).into(),
89        ))
90    }
91}
92
93impl holochain_sqlite::rusqlite::types::FromSql for WarrantOpType {
94    fn column_result(
95        value: holochain_sqlite::rusqlite::types::ValueRef<'_>,
96    ) -> holochain_sqlite::rusqlite::types::FromSqlResult<Self> {
97        String::column_result(value).and_then(|string| {
98            WarrantOpType::from_str(&string)
99                .map_err(|_| holochain_sqlite::rusqlite::types::FromSqlError::InvalidType)
100        })
101    }
102}