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
33// The observe control runs until the host cancels it.
34pub const POLICY: OperationPolicy = OperationPolicy {
35    timeout: UNBOUNDED,
36    attempt_timeout: UNBOUNDED,
37    retries: RetryPolicy::Never,
38};
39
40/* === Macros === */
41
42pub 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/* === Type Aliases === */
56
57/* === Structs === */
58
59#[derive(Clone, PartialEq, Eq, Debug, Default)]
60pub struct ControlRequest {
61    pub observer: String,
62    pub generation: u64,
63}
64
65/* === Enums === */
66
67/* === Traits === */
68
69/* === Implementations === */
70
71crate::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
100/* === Public Functions === */
101
102// The Contract Every Observer-Declaring Sidecar Serves.
103pub fn contract() -> Result<Contract, ContractError> {
104    Contract::reserved::<Control>(POLICY)
105}
106
107/* === Private Functions === */
108
109/* === Tests === */