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
44- HealthMonitorBuilder HealthMonitorBuilder::add_deadline_monitor (const IdentTag& tag,
45- deadline::DeadlineMonitorBuilder&& monitor) &&
63+ HealthMonitorBuilder HealthMonitorBuilder::add_deadline_monitor (const IdentTag& tag, DeadlineMonitorBuilder&& monitor)
4664{
4765 auto monitor_handle = monitor.drop_by_rust ();
4866 SCORE_LANGUAGE_FUTURECPP_PRECONDITION (monitor_handle.has_value ());
4967 SCORE_LANGUAGE_FUTURECPP_PRECONDITION (health_monitor_builder_handle_.as_rust_handle ().has_value ());
5068
69+ // TODO: how errors should be handled?
5170 health_monitor_builder_add_deadline_monitor (
5271 health_monitor_builder_handle_.as_rust_handle ().value (), &tag, monitor_handle.value ());
5372 return std::move (*this );
5473}
5574
56- HealthMonitorBuilder HealthMonitorBuilder::with_internal_processing_cycle (std::chrono::milliseconds cycle_duration) &&
75+ HealthMonitorBuilder HealthMonitorBuilder::with_internal_processing_cycle (std::chrono::milliseconds cycle_duration)
5776{
5877 internal_processing_cycle_duration_ = cycle_duration;
5978 return std::move (*this );
6079}
6180
62- HealthMonitorBuilder HealthMonitorBuilder::with_supervisor_api_cycle (std::chrono::milliseconds cycle_duration) &&
81+ HealthMonitorBuilder HealthMonitorBuilder::with_supervisor_api_cycle (std::chrono::milliseconds cycle_duration)
6382{
6483 supervisor_api_cycle_duration_ = cycle_duration;
6584 return std::move (*this );
6685}
6786
68- HealthMonitor HealthMonitorBuilder::build () &&
87+ score::cpp::expected< HealthMonitor, Error> HealthMonitorBuilder::build ()
6988{
70- auto handle = health_monitor_builder_handle_.drop_by_rust ();
71- SCORE_LANGUAGE_FUTURECPP_PRECONDITION (handle .has_value ());
89+ auto health_monitor_builder_handle = health_monitor_builder_handle_.drop_by_rust ();
90+ SCORE_LANGUAGE_FUTURECPP_PRECONDITION (health_monitor_builder_handle .has_value ());
7291
7392 uint32_t supervisor_duration_ms = static_cast <uint32_t >(supervisor_api_cycle_duration_.count ());
7493 uint32_t internal_duration_ms = static_cast <uint32_t >(internal_processing_cycle_duration_.count ());
7594
76- return HealthMonitor (health_monitor_builder_build (handle.value (), supervisor_duration_ms, internal_duration_ms));
95+ FFIHandle health_monitor_handle{nullptr };
96+ auto result{health_monitor_builder_build (
97+ health_monitor_builder_handle.value (), supervisor_duration_ms, internal_duration_ms, &health_monitor_handle)};
98+ if (result != kSuccess )
99+ {
100+ return score::cpp::unexpected{static_cast <Error>(result)};
101+ }
102+
103+ return score::cpp::expected<HealthMonitor, Error>{HealthMonitor{health_monitor_handle}};
77104}
78105
79- HealthMonitor::HealthMonitor (internal:: FFIHandle handle) : health_monitor_(handle)
106+ HealthMonitor::HealthMonitor (FFIHandle handle) : health_monitor_(handle)
80107{
81108 // Initialize health monitor
82109}
@@ -87,20 +114,21 @@ HealthMonitor::HealthMonitor(HealthMonitor&& other)
87114 other.health_monitor_ = nullptr ;
88115}
89116
90- score::cpp::expected<deadline:: DeadlineMonitor, Error> HealthMonitor::get_deadline_monitor (const IdentTag& tag)
117+ score::cpp::expected<DeadlineMonitor, Error> HealthMonitor::get_deadline_monitor (const IdentTag& tag)
91118{
92- auto maybe_monitor = health_monitor_get_deadline_monitor (health_monitor_, &tag) ;
93-
94- if (maybe_monitor != nullptr )
119+ FFIHandle handle{ nullptr } ;
120+ auto result{ health_monitor_get_deadline_monitor (health_monitor_, &tag, &handle)};
121+ if (result != kSuccess )
95122 {
96-
97- return score::cpp::expected<deadline::DeadlineMonitor, Error>(deadline::DeadlineMonitor{maybe_monitor});
123+ return score::cpp::unexpected (static_cast <Error>(result));
98124 }
99125
100- return score::cpp::unexpected ( Error::NotFound );
126+ return score::cpp::expected<DeadlineMonitor, Error>(DeadlineMonitor{handle} );
101127}
128+
102129void HealthMonitor::start ()
103130{
131+ // TODO: how errors should be handled?
104132 health_monitor_start (health_monitor_);
105133}
106134
0 commit comments