nucypher_core/
retrieval_kit.rs1use alloc::boxed::Box;
2use alloc::collections::BTreeSet;
3use alloc::string::String;
4
5use serde::{Deserialize, Serialize};
6use umbral_pre::Capsule;
7
8use crate::address::Address;
9use crate::conditions::Conditions;
10use crate::message_kit::MessageKit;
11use crate::versioning::{
12 messagepack_deserialize, messagepack_serialize, ProtocolObject, ProtocolObjectInner,
13};
14
15#[derive(PartialEq, Debug, Serialize, Deserialize)]
19pub struct RetrievalKit {
20 pub capsule: Capsule,
22 pub queried_addresses: BTreeSet<Address>,
24 pub conditions: Option<Conditions>,
26}
27
28impl RetrievalKit {
29 pub fn from_message_kit(message_kit: &MessageKit) -> Self {
31 Self {
32 capsule: message_kit.capsule.clone(),
33 queried_addresses: BTreeSet::<Address>::new(),
34 conditions: message_kit.conditions.clone(),
35 }
36 }
37
38 pub fn new(
40 capsule: &Capsule,
41 queried_addresses: impl IntoIterator<Item = Address>,
42 conditions: Option<&Conditions>,
43 ) -> Self {
44 Self {
46 capsule: capsule.clone(),
47 queried_addresses: queried_addresses.into_iter().collect(),
48 conditions: conditions.cloned(),
49 }
50 }
51}
52
53impl<'a> ProtocolObjectInner<'a> for RetrievalKit {
54 fn brand() -> [u8; 4] {
55 *b"RKit"
56 }
57
58 fn version() -> (u16, u16) {
59 (3, 0)
60 }
61
62 fn unversioned_to_bytes(&self) -> Box<[u8]> {
63 messagepack_serialize(&self)
64 }
65
66 fn unversioned_from_bytes(minor_version: u16, bytes: &[u8]) -> Option<Result<Self, String>> {
67 if minor_version == 0 {
68 Some(messagepack_deserialize(bytes))
69 } else {
70 None
71 }
72 }
73}
74
75impl<'a> ProtocolObject<'a> for RetrievalKit {}