Skip to main content

bc_xid/
delegate.rs

1use bc_components::{Reference, ReferenceProvider, XID, XIDProvider};
2use bc_envelope::prelude::*;
3
4use super::{Permissions, Shared, XIDDocument};
5use crate::{Error, HasPermissions, Result};
6
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub struct Delegate {
9    controller: Shared<XIDDocument>,
10    permissions: Permissions,
11}
12
13impl std::hash::Hash for Delegate {
14    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
15        self.controller.read().xid().hash(state);
16    }
17}
18
19impl Delegate {
20    pub fn new(controller: impl AsRef<XIDDocument>) -> Self {
21        Self {
22            controller: Shared::new(controller.as_ref().clone()),
23            permissions: Permissions::new(),
24        }
25    }
26
27    pub fn controller(&self) -> &Shared<XIDDocument> { &self.controller }
28}
29
30impl HasPermissions for Delegate {
31    fn permissions(&self) -> &Permissions { &self.permissions }
32
33    fn permissions_mut(&mut self) -> &mut Permissions { &mut self.permissions }
34}
35
36impl EnvelopeEncodable for Delegate {
37    fn into_envelope(self) -> Envelope {
38        let doc = self.controller.read();
39        let envelope = doc.clone().into_envelope().wrap();
40        self.permissions.add_to_envelope(envelope)
41    }
42}
43
44impl TryFrom<&Envelope> for Delegate {
45    type Error = Error;
46
47    fn try_from(envelope: &Envelope) -> Result<Self> {
48        let permissions = Permissions::try_from_envelope(envelope)?;
49        let inner = envelope.try_unwrap()?;
50        let controller = Shared::new(XIDDocument::try_from(inner)?);
51        Ok(Self { controller, permissions })
52    }
53}
54
55impl TryFrom<Envelope> for Delegate {
56    type Error = Error;
57
58    fn try_from(envelope: Envelope) -> Result<Self> {
59        Self::try_from(&envelope)
60    }
61}
62
63impl XIDProvider for Delegate {
64    fn xid(&self) -> XID { self.controller.read().xid() }
65}
66
67impl ReferenceProvider for Delegate {
68    fn reference(&self) -> Reference {
69        self.controller.read().xid().reference()
70    }
71}