harmos_domain/
observers.rs1use std::borrow::Cow;
24use crate::operations::{Contract, ContractError, OperationPolicy, ReplaySafety, RestartPolicy, RetryPolicy, UNBOUNDED, Visibility};
28use crate::schema::declaration::{Field, Kind};
29use crate::schema::{Cardinality, Described};
30
31pub const POLICY: OperationPolicy =
35 OperationPolicy { timeout: UNBOUNDED, attempt_timeout: UNBOUNDED, retries: RetryPolicy::Never, restart: RestartPolicy::Never };
36
37crate::declare!(Control {
40 id: "harmos.observe",
41 version: 1,
42 policy: POLICY,
43 response: (),
44 visibility: Visibility::Host,
45 replay: ReplaySafety::Idempotent,
46});
47
48#[derive(Clone, PartialEq, Eq, Debug, Default)]
53pub struct Control {
54 pub observer: String,
55 pub generation: u64,
56}
57
58crate::message::postcard_product!(Control { observer: String, generation: u64 });
65
66impl crate::MemorySize for Control {
67 fn memory_size(&self) -> usize {
68 std::mem::size_of::<Self>().saturating_add(self.observer.capacity())
69 }
70}
71
72impl Described for Control {
73 const NAME: &'static str = concat!(module_path!(), "::", stringify!(Control));
74 const FIELDS: &'static [Field] = &[
75 Field { name: Cow::Borrowed("observer"), tag: 1, kind: Kind::String, cardinality: Cardinality::Required },
76 Field { name: Cow::Borrowed("generation"), tag: 2, kind: Kind::U64, cardinality: Cardinality::Required },
77 ];
78 const MARKER: &'static [u8] = &crate::schema::declaration::encode::<
79 { crate::schema::declaration::encoded_len(Self::NAME, Self::FIELDS) },
80 >(Self::NAME, Self::FIELDS);
81}
82
83pub fn contract() -> Result<Contract, ContractError> {
87 Contract::reserved::<Control>(POLICY)
88}
89
90