1#![allow(clippy::missing_safety_doc)]
6
7use std::ffi::c_void;
8
9use crate::graph::{Graph, Poller, State};
10use crate::runtime;
11use crate::status::Error;
12
13use super::*;
14
15mod diagnostics;
16mod input_poller;
17mod lifecycle;
18mod observer;
19
20pub use diagnostics::*;
21pub use input_poller::*;
22pub use lifecycle::*;
23pub use observer::*;
24
25#[derive(Default)]
33pub struct GraphSlot {
34 graph: Option<Graph>,
35}
36
37unsafe fn slot_mut<'a>(g: *mut LMFlowGraph) -> Option<&'a mut GraphSlot> {
38 if g.is_null() {
39 None
40 } else {
41 Some(&mut *(g as *mut GraphSlot))
42 }
43}
44
45unsafe fn with_graph<F: FnOnce(&Graph) -> i32>(g: *mut LMFlowGraph, f: F) -> i32 {
46 match slot_mut(g).and_then(|s| s.graph.as_ref()) {
47 Some(gr) => f(gr),
48 None => fail(Error::State("graph not yet initialized".into())),
49 }
50}
51
52pub(super) unsafe fn graph_of<'a>(g: *mut LMFlowGraph) -> Option<&'a Graph> {
54 slot_mut(g).and_then(|s| s.graph.as_ref())
55}