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}