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