pub mod access_token;
pub mod addr_list;
pub mod beacon;
pub mod ca_server;
pub mod introspection;
pub mod ioc_app;
pub mod iocsh;
pub mod monitor;
pub mod rate_limit;
#[cfg(feature = "cap-tokens")]
pub mod signed_beacon;
pub mod tcp;
pub mod udp;
pub use ca_server::{AccessRightsNotifier, CaServer, CaServerBuilder, ServerStats};
pub use tcp::ServerConnectionEvent;
use epics_base_rs::error::CaResult;
use epics_base_rs::server::ioc_app::IocRunConfig;
pub(super) fn apply_long_string(snap: &mut epics_base_rs::server::snapshot::Snapshot) {
use epics_base_rs::types::EpicsValue;
const MAX_STRING_SIZE: usize = 40;
let v = std::mem::replace(&mut snap.value, EpicsValue::Long(0));
snap.value = match v {
EpicsValue::String(s) => {
let mut b = s.into_bytes();
b.push(0); b.resize(MAX_STRING_SIZE, 0); EpicsValue::CharArray(b)
}
other => other,
};
}
pub(super) fn apply_native_long_string(snap: &mut epics_base_rs::server::snapshot::Snapshot) {
use epics_base_rs::types::{EpicsValue, PvString};
let v = std::mem::replace(&mut snap.value, EpicsValue::Long(0));
snap.value = match v {
EpicsValue::CharArray(bytes) => {
let end = bytes.iter().position(|&b| b == 0).unwrap_or(bytes.len());
EpicsValue::String(PvString::from_bytes(&bytes[..end]))
}
other => other,
};
}
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub(super) enum LongStringMode {
Plain,
DollarChar,
NativeString,
}
pub(super) fn apply_long_string_mode(
snap: &mut epics_base_rs::server::snapshot::Snapshot,
mode: LongStringMode,
) {
match mode {
LongStringMode::DollarChar => apply_long_string(snap),
LongStringMode::NativeString => apply_native_long_string(snap),
LongStringMode::Plain => {}
}
}
pub async fn run_ca_ioc(config: IocRunConfig) -> CaResult<()> {
let mut server = CaServer::from_parts(
config.db,
config.port,
config.tcp_port,
config.acf,
config.autosave_config,
config.autosave_manager,
);
server.set_after_init_hooks(config.after_init_hooks);
let casr = iocsh::casr_command(server.stats());
server
.run_with_shell(move |shell| {
shell.register(casr);
for cmd in config.shell_commands {
shell.register(cmd);
}
})
.await
}