use super::*;
use crate::{calc_config, calc_input_names, calc_output_names, py_json_methods};
#[cfg(feature = "python")]
use pyo3::prelude::*;
#[derive(Serialize, Deserialize, Default, Debug)]
#[cfg_attr(feature = "python", pyo3::prelude::pyclass)]
pub struct Constant {
y: f64,
save_outputs: bool,
#[serde(default)]
output_unit: Option<String>,
#[serde(skip)]
output_index: usize,
}
impl Constant {
pub fn new(y: f64, save_outputs: bool) -> Box<Self> {
let output_index = usize::MAX;
Box::new(Self {
y,
save_outputs,
output_unit: None,
output_index,
})
}
pub fn with_output_unit(mut self: Box<Self>, unit: impl Into<String>) -> Box<Self> {
self.output_unit = Some(unit.into());
self
}
}
py_json_methods!(
Constant,
Calc,
#[new]
#[pyo3(signature = (y, save_outputs, output_unit = None))]
fn py_new(y: f64, save_outputs: bool, output_unit: Option<String>) -> PyResult<Self> {
let mut calc = Self::new(y, save_outputs);
calc.output_unit = output_unit;
Ok(*calc)
}
);
#[typetag::serde]
impl Calc for Constant {
fn init(
&mut self,
_: ControllerCtx,
_: Vec<usize>,
output_range: Range<usize>,
) -> Result<(), String> {
self.output_index = output_range.clone().next().unwrap();
Ok(())
}
fn terminate(&mut self) -> Result<(), String> {
self.output_index = usize::MAX;
Ok(())
}
fn eval(&mut self, tape: &mut [f64]) -> Result<(), String> {
tape[self.output_index] = self.y;
Ok(())
}
fn get_input_map(&self) -> BTreeMap<CalcInputName, FieldName> {
BTreeMap::new()
}
fn update_input_map(&mut self, field: &str, _: &str) -> Result<(), String> {
Err(format!("Unrecognized field {field}"))
}
fn get_output_units(&self) -> Vec<Option<String>> {
vec![self.output_unit.clone()]
}
calc_config!(y);
calc_input_names!();
calc_output_names!(y);
}