]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
feature: provide a Rust binding to the feature API
authorJason Ish <jason.ish@oisf.net>
Fri, 15 Dec 2023 00:19:41 +0000 (18:19 -0600)
committerVictor Julien <victor@inliniac.net>
Tue, 19 Dec 2023 08:51:22 +0000 (09:51 +0100)
As the feature module is not available for Rust unit tests, a mock
version is also provided.

rust/src/feature.rs [new file with mode: 0644]
rust/src/lib.rs

diff --git a/rust/src/feature.rs b/rust/src/feature.rs
new file mode 100644 (file)
index 0000000..abd0966
--- /dev/null
@@ -0,0 +1,60 @@
+/* Copyright (C) 2023 Open Information Security Foundation
+ *
+ * You can copy, redistribute or modify this Program under the terms of
+ * the GNU General Public License version 2 as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+//! Rust bindings to the "feature" API.
+//!
+//! As this feature module is a binding to a Suricata C module it is
+//! not available to Rust unit tests. Instead when running Rust unit
+//! tests and "mock" version is provided that will return true for any
+//! feature starting with "true" and false for any other feature name.
+
+#[cfg(test)]
+mod mock {
+    /// Check for a feature returning true if found.
+    ///
+    /// This a "mock" variant of `requires` that will return true for
+    /// any feature starting with string `true`, and false for
+    /// anything else.
+    pub fn requires(feature: &str) -> bool {
+        return feature.starts_with("true");
+    }
+}
+
+#[cfg(not(test))]
+mod real {
+    use std::ffi::CString;
+    use std::os::raw::c_char;
+
+    extern "C" {
+        fn RequiresFeature(feature: *const c_char) -> bool;
+    }
+
+    /// Check for a feature returning true if found.
+    pub fn requires(feature: &str) -> bool {
+        if let Ok(feature) = CString::new(feature) {
+            unsafe { RequiresFeature(feature.as_ptr()) }
+        } else {
+            false
+        }
+    }
+}
+
+#[cfg(not(test))]
+pub use real::*;
+
+#[cfg(test)]
+pub use mock::*;
index da2859637783d318e8b94f1b9b5a43b9e9d72121..84b82bde19f75cf5438fa07b055542f04a3995ff 100644 (file)
@@ -116,3 +116,4 @@ pub mod plugin;
 pub mod lzma;
 pub mod util;
 pub mod ffi;
+pub mod feature;