harmos_domain/
observers.rs1use std::borrow::Cow;
24use crate::operations::{Contract, ContractError, OperationPolicy, ReplaySafety, RetryPolicy, UNBOUNDED, Visibility};
28use crate::schema::declaration::{Field, Kind};
29use crate::schema::{Cardinality, Described};
30
31pub const POLICY: OperationPolicy = OperationPolicy {
34 timeout: UNBOUNDED,
35 attempt_timeout: UNBOUNDED,
36 retries: RetryPolicy::Never,
37};
38
39pub struct Control;
42
43impl crate::operations::OperationDeclaration for Control {
44 type Request = ControlRequest;
45 type Response = ();
46 type Input = crate::operations::NoStream;
47 type Output = crate::operations::NoStream;
48 const ID: &'static str = "harmos_observe";
49 const POLICY: crate::operations::OperationPolicy = POLICY;
50 const VISIBILITY: crate::operations::Visibility = Visibility::Host;
51 const REPLAY: crate::operations::ReplaySafety = ReplaySafety::Idempotent;
52}
53
54#[derive(Clone, PartialEq, Eq, Debug, Default)]
59pub struct ControlRequest {
60 pub observer: String,
61 pub generation: u64,
62}
63
64crate::message::postcard_product!(ControlRequest { observer: String, generation: u64 });
71
72impl crate::MemorySize for ControlRequest {
73 fn memory_size(&self) -> usize {
74 std::mem::size_of::<Self>().saturating_add(self.observer.capacity())
75 }
76}
77
78impl Described for ControlRequest {
79 const NAME: &'static str = concat!(module_path!(), "::", stringify!(ControlRequest));
80 const FIELDS: &'static [Field] = &[
81 Field {
82 name: Cow::Borrowed("observer"),
83 tag: 1,
84 kind: Kind::String,
85 cardinality: Cardinality::Required,
86 },
87 Field {
88 name: Cow::Borrowed("generation"),
89 tag: 2,
90 kind: Kind::U64,
91 cardinality: Cardinality::Required,
92 },
93 ];
94 const MARKER: &'static [u8] = &crate::schema::declaration::encode::<
95 { crate::schema::declaration::encoded_len(Self::NAME, Self::FIELDS) },
96 >(Self::NAME, Self::FIELDS);
97}
98
99pub fn contract() -> Result<Contract, ContractError> {
103 Contract::reserved::<Control>(POLICY)
104}
105
106