#![allow(clippy::missing_errors_doc)]
#![allow(unsafe_code)]
#![allow(unsafe_op_in_unsafe_fn)]
#![allow(clippy::useless_conversion)]
#![allow(clippy::needless_lifetimes)]
#![allow(clippy::new_without_default)]
#![allow(clippy::unwrap_used)]
#![allow(clippy::expect_used)]
use std::sync::Arc;
use pyo3::exceptions::PyRuntimeError;
use pyo3::prelude::*;
use zerodds_dcps::condition::{Condition, QueryCondition, ReadCondition};
#[pyclass(name = "ReadCondition", module = "zerodds_py")]
pub struct PyReadCondition {
pub inner: Arc<ReadCondition>,
}
#[pymethods]
impl PyReadCondition {
#[new]
#[pyo3(signature = (sample_state_mask, view_state_mask, instance_state_mask, state_check_mode="any"))]
fn new(
sample_state_mask: u32,
view_state_mask: u32,
instance_state_mask: u32,
state_check_mode: &str,
) -> PyResult<Self> {
let trigger: Box<dyn Fn(u32, u32, u32) -> bool + Send + Sync + 'static> =
match state_check_mode {
"any" => Box::new(|ss, vs, is_| ss != 0 && vs != 0 && is_ != 0),
"never" => Box::new(|_, _, _| false),
"always" => Box::new(|_, _, _| true),
other => {
return Err(PyRuntimeError::new_err(format!(
"unknown state_check_mode {other:?}; expected 'any'|'never'|'always'"
)));
}
};
let cond = ReadCondition::new(
sample_state_mask,
view_state_mask,
instance_state_mask,
trigger,
);
Ok(Self { inner: cond })
}
fn get_sample_state_mask(&self) -> u32 {
self.inner.get_sample_state_mask()
}
fn get_view_state_mask(&self) -> u32 {
self.inner.get_view_state_mask()
}
fn get_instance_state_mask(&self) -> u32 {
self.inner.get_instance_state_mask()
}
fn get_trigger_value(&self) -> bool {
self.inner.get_trigger_value()
}
}
#[pyclass(name = "QueryCondition", module = "zerodds_py")]
pub struct PyQueryCondition {
pub inner: Arc<QueryCondition>,
}
#[pymethods]
impl PyQueryCondition {
#[new]
#[pyo3(signature = (
sample_state_mask,
view_state_mask,
instance_state_mask,
query_expression,
query_parameters=Vec::new()
))]
fn new(
sample_state_mask: u32,
view_state_mask: u32,
instance_state_mask: u32,
query_expression: String,
query_parameters: Vec<String>,
) -> PyResult<Self> {
let base = ReadCondition::new(
sample_state_mask,
view_state_mask,
instance_state_mask,
|ss, vs, is_| ss != 0 && vs != 0 && is_ != 0,
);
let qc = QueryCondition::new(base, query_expression, query_parameters)
.map_err(|e| PyRuntimeError::new_err(format!("QueryCondition::new failed: {e:?}")))?;
Ok(Self { inner: qc })
}
fn get_trigger_value(&self) -> bool {
self.inner.get_trigger_value()
}
}