use crate::error::{CaError, CaResult};
use crate::types::{DbFieldType, EpicsValue};
fn raw_soft_rval(record: &str, value: &EpicsValue, rval_type: DbFieldType) -> CaResult<EpicsValue> {
if value.to_f64().is_none() {
return Err(CaError::TypeMismatch(
format!("{record} Raw Soft Channel: INP value not numeric").into(),
));
}
Ok(value.convert_to(rval_type))
}
pub(crate) fn raw_soft_rval_i32(record: &str, value: &EpicsValue) -> CaResult<i32> {
match raw_soft_rval(record, value, DbFieldType::Long)? {
EpicsValue::Long(v) => Ok(v),
other => Err(CaError::TypeMismatch(
format!("{record} Raw Soft Channel: INP value not a scalar ({other:?})").into(),
)),
}
}
pub(crate) fn raw_soft_rval_u32(record: &str, value: &EpicsValue) -> CaResult<u32> {
match raw_soft_rval(record, value, DbFieldType::ULong)? {
EpicsValue::ULong(v) => Ok(v),
other => Err(CaError::TypeMismatch(
format!("{record} Raw Soft Channel: INP value not a scalar ({other:?})").into(),
)),
}
}
pub(crate) fn count_put(value: &EpicsValue) -> Option<i32> {
value.to_dbf_i32()
}
pub mod acalcout;
pub mod ai;
pub mod alarm_filter;
pub mod ao;
pub mod asub_record;
pub mod asyn_record;
pub mod bi;
pub mod bo;
pub mod busy;
pub mod calc;
pub(crate) mod calc_compile;
pub mod calcout;
pub mod compress;
pub mod convert_phase;
pub mod dfanout;
pub mod event;
pub mod fanout;
pub mod histogram;
pub mod int64in;
pub mod int64out;
pub mod link_status;
pub mod longin;
pub mod longout;
pub mod lsi;
pub mod lso;
pub mod mbbi;
pub mod mbbi_direct;
pub mod mbbo;
pub mod mbbo_direct;
pub mod permissive;
pub mod printf;
pub mod scalcout;
pub mod sel;
pub mod seq;
pub mod sseq;
pub mod state;
pub mod stringin;
pub mod stringout;
pub mod sub_record;
pub mod swait;
pub mod transform;
pub mod waveform;