diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..b9d6211c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + // Generate `rust-project.json` with bazel run @rules_rust//tools/rust_analyzer:gen_rust_project + "rust-analyzer.linkedProjects": [ + "rust-project.json" + ] +} diff --git a/MODULE.bazel b/MODULE.bazel index 00026fa1..e48c2e82 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -122,6 +122,14 @@ bazel_dep(name = "bazel_skylib", version = "1.8.1") bazel_dep(name = "rules_doxygen", version = "2.5.0") bazel_dep(name = "score_baselibs", version = "0.2.2") +bazel_dep(name = "score_baselibs_rust", version = "0.0.1") +git_override( + module_name = "score_baselibs_rust", + commit = "9ee64ac85f2a990ef75b2858253ee44bfc1a7ab7", + remote = "https://github.com/eclipse-score/baselibs_rust.git", +) + + # Doxygen extension for documentation generation doxygen_extension = use_extension("@rules_doxygen//:extensions.bzl", "doxygen_extension") use_repo(doxygen_extension, "doxygen") diff --git a/score/mw/com/example/com-api-example/basic-consumer-producer.rs b/score/mw/com/example/com-api-example/basic-consumer-producer.rs index b113c932..d269bc6a 100644 --- a/score/mw/com/example/com-api-example/basic-consumer-producer.rs +++ b/score/mw/com/example/com-api-example/basic-consumer-producer.rs @@ -34,7 +34,7 @@ impl VehicleMonitor { /// Monitor tire data from the consumer pub fn read_tire_data(&self) -> Result { - let mut sample_buf = SampleContainer::new(); + let mut sample_buf = SampleContainer::new(3); match self.tire_subscriber.try_receive(&mut sample_buf, 1) { Ok(0) => Err(Error::Fail), diff --git a/score/mw/com/impl/rust/com-api/com-api-concept/BUILD b/score/mw/com/impl/rust/com-api/com-api-concept/BUILD index 294f4893..9dce1400 100644 --- a/score/mw/com/impl/rust/com-api/com-api-concept/BUILD +++ b/score/mw/com/impl/rust/com-api/com-api-concept/BUILD @@ -22,7 +22,9 @@ rust_library( visibility = [ "//visibility:public", # platform_only ], - deps = [], + deps = [ + "@score_baselibs_rust//src/containers:containers", + ], ) rust_test( diff --git a/score/mw/com/impl/rust/com-api/com-api-concept/com_api_concept.rs b/score/mw/com/impl/rust/com-api/com-api-concept/com_api_concept.rs index 73004a2c..28409021 100644 --- a/score/mw/com/impl/rust/com-api/com-api-concept/com_api_concept.rs +++ b/score/mw/com/impl/rust/com-api/com-api-concept/com_api_concept.rs @@ -50,8 +50,8 @@ use core::fmt::Debug; use core::future::Future; use core::ops::{Deref, DerefMut}; pub mod reloc; +use containers::fixed_capacity::FixedCapacityQueue; pub use reloc::Reloc; -use std::collections::VecDeque; use std::path::Path; /// Error enumeration for different failure cases in the Consumer/Producer/Runtime APIs. @@ -597,21 +597,15 @@ pub trait Subscriber { /// # Type Parameters /// * `S`: The sample type stored in the container. pub struct SampleContainer { - inner: VecDeque, -} - -impl Default for SampleContainer { - fn default() -> Self { - Self { - inner: VecDeque::new(), - } - } + inner: FixedCapacityQueue, } impl SampleContainer { /// Creates a new, empty `SampleContainer` - pub fn new() -> Self { - Self::default() + pub fn new(capacity: usize) -> Self { + Self { + inner: FixedCapacityQueue::new(capacity), + } } /// Returns an iterator over references to the samples in the container. @@ -645,7 +639,7 @@ impl SampleContainer { /// # Returns /// A `Result` indicating success or failure. pub fn push_back(&mut self, new: S) -> Result<()> { - self.inner.push_back(new); + self.inner.push_back(new).map_err(|_| Error::AllocateFailed)?; Ok(()) }