Current section

Files

Jump to
rbt_weave nif src lib.rs
Raw

nif/src/lib.rs

#![deny(unsafe_code, clippy::unwrap_used, clippy::expect_used)]
#![allow(clippy::needless_pass_by_value)]
use std::collections::HashSet;
use serde::Deserialize;
use weave_graph::detect::DetectOpts;
use weave_graph::graph::{IndexedSubgraph, Subgraph};
/// NIF options passed from Elixir as JSON.
#[derive(Debug, Default, Deserialize)]
struct NifOpts {
#[serde(default = "default_max_depth")]
max_depth: usize,
#[serde(default)]
patterns: Option<Vec<String>>,
}
fn default_max_depth() -> usize {
6
}
#[rustler::nif]
fn health_check() -> String {
String::from("ok")
}
/// Detect conflict-of-interest patterns in a subgraph.
///
/// Takes a JSON-serialized `Subgraph` and an optional JSON options
/// string. Returns a JSON-serialized list of `ConflictPattern`s.
#[rustler::nif(schedule = "DirtyCpu")]
fn detect_conflicts(subgraph_json: String, opts_json: String) -> Result<String, String> {
let subgraph: Subgraph =
serde_json::from_str(&subgraph_json).map_err(|e| format!("invalid subgraph: {e}"))?;
let nif_opts: NifOpts =
serde_json::from_str(&opts_json).map_err(|e| format!("invalid opts: {e}"))?;
let detect_opts = DetectOpts {
max_depth: nif_opts.max_depth,
pattern_ids: nif_opts
.patterns
.map(|ps| ps.into_iter().collect::<HashSet<_>>()),
};
let indexed = IndexedSubgraph::from_subgraph(&subgraph);
let results = weave_graph::detect::detect_conflicts(&indexed, &detect_opts);
serde_json::to_string(&results).map_err(|e| format!("serialization error: {e}"))
}
rustler::init!("Elixir.Weave.Native");