1212 ********************************************************************************/
1313#include " score/hm/health_monitor.h"
1414
15+ namespace
16+ {
1517extern " C" {
1618using namespace score ::hm;
17-
18- // Health Monitor Foreign Function Interface Declarations that are exported by Rust implementation library
19- internal::FFIHandle health_monitor_builder_create ();
20- void health_monitor_builder_destroy (internal::FFIHandle handler);
21-
22- internal::FFIHandle health_monitor_builder_build (internal::FFIHandle health_monitor_builder_handle,
23- uint32_t supervisor_cycle_ms,
24- uint32_t internal_cycle_ms);
25- void health_monitor_builder_add_deadline_monitor (internal::FFIHandle handle,
26- const IdentTag* tag,
27- internal::FFIHandle monitor_handle);
28-
29- internal::FFIHandle health_monitor_get_deadline_monitor (internal::FFIHandle health_monitor_handle, const IdentTag* tag);
30- void health_monitor_start (internal::FFIHandle health_monitor_handle);
31- void health_monitor_destroy (internal::FFIHandle handler);
19+ using namespace score ::hm::internal;
20+ using namespace score ::hm::deadline;
21+
22+ // Functions below must match functions defined in `crate::ffi`.
23+
24+ FFICode health_monitor_builder_create (FFIHandle* health_monitor_builder_handle);
25+ FFICode health_monitor_builder_destroy (FFIHandle health_monitor_builder_handle);
26+ FFICode health_monitor_builder_build (FFIHandle health_monitor_builder_handle,
27+ uint32_t supervisor_cycle_ms,
28+ uint32_t internal_cycle_ms,
29+ FFIHandle* health_monitor_handle);
30+ FFICode health_monitor_builder_add_deadline_monitor (FFIHandle health_monitor_builder_handle,
31+ const IdentTag* monitor_tag,
32+ FFIHandle deadline_monitor_builder_handle);
33+ FFICode health_monitor_get_deadline_monitor (FFIHandle health_monitor_handle,
34+ const IdentTag* monitor_tag,
35+ FFIHandle* deadline_monitor_handle);
36+ FFICode health_monitor_start (FFIHandle health_monitor_handle);
37+ FFICode health_monitor_destroy (FFIHandle health_monitor_handle);
3238}
39+ } // namespace
3340
3441// C++ wrapper for Rust library - the API implementation obeys the Rust API semantics and it's invariants
3542
3643namespace score ::hm
3744{
3845
39- HealthMonitorBuilder::HealthMonitorBuilder ()
40- : health_monitor_builder_handle_{health_monitor_builder_create (), &health_monitor_builder_destroy}
46+ score::cpp::expected<HealthMonitorBuilder, Error> HealthMonitorBuilder::create ()
47+ {
48+ FFIHandle handle{nullptr };
49+ auto result{health_monitor_builder_create (&handle)};
50+ if (result != kSuccess )
51+ {
52+ return score::cpp::unexpected (static_cast <Error>(result));
53+ }
54+
55+ return score::cpp::expected<HealthMonitorBuilder, Error>{HealthMonitorBuilder{handle}};
56+ }
57+
58+ HealthMonitorBuilder::HealthMonitorBuilder (FFIHandle handle)
59+ : health_monitor_builder_handle_(handle, &health_monitor_builder_destroy)
4160{
4261}
4362
4463HealthMonitorBuilder HealthMonitorBuilder::add_deadline_monitor (const IdentTag& tag,
45- deadline:: DeadlineMonitorBuilder&& monitor) &&
64+ DeadlineMonitorBuilder&& monitor) &&
4665{
4766 auto monitor_handle = monitor.drop_by_rust ();
4867 SCORE_LANGUAGE_FUTURECPP_PRECONDITION (monitor_handle.has_value ());
4968 SCORE_LANGUAGE_FUTURECPP_PRECONDITION (health_monitor_builder_handle_.as_rust_handle ().has_value ());
5069
70+ // TODO: how errors should be handled?
5171 health_monitor_builder_add_deadline_monitor (
5272 health_monitor_builder_handle_.as_rust_handle ().value (), &tag, monitor_handle.value ());
5373 return std::move (*this );
@@ -65,18 +85,26 @@ HealthMonitorBuilder HealthMonitorBuilder::with_supervisor_api_cycle(std::chrono
6585 return std::move (*this );
6686}
6787
68- HealthMonitor HealthMonitorBuilder::build () &&
88+ score::cpp::expected< HealthMonitor, Error> HealthMonitorBuilder::build () &&
6989{
70- auto handle = health_monitor_builder_handle_.drop_by_rust ();
71- SCORE_LANGUAGE_FUTURECPP_PRECONDITION (handle .has_value ());
90+ auto health_monitor_builder_handle = health_monitor_builder_handle_.drop_by_rust ();
91+ SCORE_LANGUAGE_FUTURECPP_PRECONDITION (health_monitor_builder_handle .has_value ());
7292
7393 uint32_t supervisor_duration_ms = static_cast <uint32_t >(supervisor_api_cycle_duration_.count ());
7494 uint32_t internal_duration_ms = static_cast <uint32_t >(internal_processing_cycle_duration_.count ());
7595
76- return HealthMonitor (health_monitor_builder_build (handle.value (), supervisor_duration_ms, internal_duration_ms));
96+ FFIHandle health_monitor_handle{nullptr };
97+ auto result{health_monitor_builder_build (
98+ health_monitor_builder_handle.value (), supervisor_duration_ms, internal_duration_ms, &health_monitor_handle)};
99+ if (result != kSuccess )
100+ {
101+ return score::cpp::unexpected{static_cast <Error>(result)};
102+ }
103+
104+ return score::cpp::expected<HealthMonitor, Error>{HealthMonitor{health_monitor_handle}};
77105}
78106
79- HealthMonitor::HealthMonitor (internal:: FFIHandle handle) : health_monitor_(handle)
107+ HealthMonitor::HealthMonitor (FFIHandle handle) : health_monitor_(handle)
80108{
81109 // Initialize health monitor
82110}
@@ -87,20 +115,21 @@ HealthMonitor::HealthMonitor(HealthMonitor&& other)
87115 other.health_monitor_ = nullptr ;
88116}
89117
90- score::cpp::expected<deadline:: DeadlineMonitor, Error> HealthMonitor::get_deadline_monitor (const IdentTag& tag)
118+ score::cpp::expected<DeadlineMonitor, Error> HealthMonitor::get_deadline_monitor (const IdentTag& tag)
91119{
92- auto maybe_monitor = health_monitor_get_deadline_monitor (health_monitor_, &tag) ;
93-
94- if (maybe_monitor != nullptr )
120+ FFIHandle handle{ nullptr } ;
121+ auto result{ health_monitor_get_deadline_monitor (health_monitor_, &tag, &handle)};
122+ if (result != kSuccess )
95123 {
96-
97- return score::cpp::expected<deadline::DeadlineMonitor, Error>(deadline::DeadlineMonitor{maybe_monitor});
124+ return score::cpp::unexpected (static_cast <Error>(result));
98125 }
99126
100- return score::cpp::unexpected ( Error::NotFound );
127+ return score::cpp::expected<DeadlineMonitor, Error>(DeadlineMonitor{handle} );
101128}
129+
102130void HealthMonitor::start ()
103131{
132+ // TODO: how errors should be handled?
104133 health_monitor_start (health_monitor_);
105134}
106135
0 commit comments