1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
use crate::api::Identity; use crate::api_capnp::{event, EventType}; use serde_derive::{Deserialize, Serialize}; use zeroize::Zeroize; #[derive(Clone, Debug, Serialize, Deserialize, Zeroize)] #[zeroize(drop)] pub enum Event { StoreUnlocked { store_name: String, identity: Identity, }, StoreLocked { store_name: String, }, SecretOpened { store_name: String, identity: Identity, secret_id: String, }, SecretVersionAdded { store_name: String, identity: Identity, secret_id: String, }, IdentityAdded { store_name: String, identity: Identity, }, ClipboardProviding { store_name: String, block_id: String, property: String, }, ClipboardDone, } impl Event { pub fn from_reader(reader: event::Reader) -> capnp::Result<Self> { match reader.get_type()? { EventType::StoreUnlocked => Ok(Event::StoreUnlocked { store_name: reader.get_store_name()?.to_string(), identity: Identity::from_reader(reader.get_identity()?)?, }), EventType::StoreLocked => Ok(Event::StoreLocked { store_name: reader.get_store_name()?.to_string(), }), EventType::SecretOpened => Ok(Event::SecretOpened { store_name: reader.get_store_name()?.to_string(), identity: Identity::from_reader(reader.get_identity()?)?, secret_id: reader.get_secret_id()?.to_string(), }), EventType::SecretVersionAdded => Ok(Event::SecretVersionAdded { store_name: reader.get_store_name()?.to_string(), identity: Identity::from_reader(reader.get_identity()?)?, secret_id: reader.get_secret_id()?.to_string(), }), EventType::IdentityAdded => Ok(Event::IdentityAdded { store_name: reader.get_store_name()?.to_string(), identity: Identity::from_reader(reader.get_identity()?)?, }), EventType::ClipboardProviding => Ok(Event::ClipboardProviding { store_name: reader.get_store_name()?.to_string(), block_id: reader.get_block_id()?.to_string(), property: reader.get_property()?.to_string(), }), EventType::ClipboardDone => Ok(Event::ClipboardDone), } } pub fn to_builder(&self, mut builder: event::Builder) -> capnp::Result<()> { match &self { Event::StoreUnlocked { store_name, identity } => { builder.set_type(EventType::StoreUnlocked); builder.set_store_name(store_name); identity.to_builder(builder.init_identity()); } Event::StoreLocked { store_name } => { builder.set_type(EventType::StoreLocked); builder.set_store_name(store_name); } Event::SecretOpened { store_name, identity, secret_id, } => { builder.set_type(EventType::SecretOpened); builder.set_store_name(store_name); builder.set_secret_id(secret_id); identity.to_builder(builder.init_identity()); } Event::SecretVersionAdded { store_name, identity, secret_id, } => { builder.set_type(EventType::SecretVersionAdded); builder.set_store_name(store_name); builder.set_secret_id(secret_id); identity.to_builder(builder.init_identity()); } Event::IdentityAdded { store_name, identity } => { builder.set_type(EventType::IdentityAdded); builder.set_store_name(store_name); identity.to_builder(builder.init_identity()); } Event::ClipboardProviding { store_name, block_id, property, } => { builder.set_type(EventType::ClipboardProviding); builder.set_store_name(store_name); builder.set_block_id(block_id); builder.set_property(property); } Event::ClipboardDone => { builder.set_type(EventType::ClipboardDone); } } Ok(()) } } pub trait EventHandler { fn handle(&self, event: Event); } pub trait EventHub { fn send(&self, event: Event); } pub trait EventSubscription {}