Skip to main content

harmos_domain/
observers.rs

1/* ***
2 *
3 * Harmos
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * ***
8 */
9
10// The built-in observe control `harmos.observe`. A sidecar that declares
11// observers serves it: the host submits it with the observer's identity, the
12// sidecar initializes and ticks that observer for as long as the invocation
13// runs, and cancelling the invocation stops and cleans it up through the
14// ordinary operation lifecycle.
15
16/* === Modules === */
17
18/* === Re-Exports === */
19
20/* === Imports === */
21
22// Standard Library Imports
23use std::borrow::Cow;
24// Third Party Imports
25
26// Local Imports
27use crate::operations::{Contract, ContractError, OperationPolicy, ReplaySafety, RetryPolicy, UNBOUNDED, Visibility};
28use crate::schema::declaration::{Field, Kind};
29use crate::schema::{Cardinality, Described};
30
31/* === Constants === */
32
33pub const POLICY: OperationPolicy = OperationPolicy {
34    timeout: UNBOUNDED,
35    attempt_timeout: UNBOUNDED,
36    retries: RetryPolicy::Never,
37};
38
39/* === Macros === */
40
41pub 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/* === Type Aliases === */
55
56/* === Structs === */
57
58#[derive(Clone, PartialEq, Eq, Debug, Default)]
59pub struct ControlRequest {
60    pub observer: String,
61    pub generation: u64,
62}
63
64/* === Enums === */
65
66/* === Traits === */
67
68/* === Implementations === */
69
70crate::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
99/* === Public Functions === */
100
101// The Contract Every Observer-Declaring Sidecar Serves.
102pub fn contract() -> Result<Contract, ContractError> {
103    Contract::reserved::<Control>(POLICY)
104}
105
106/* === Private Functions === */
107
108/* === Tests === */