viva_genapi/io.rs
1//! Register access abstraction for GenApi transports.
2
3use crate::GenApiError;
4
5/// Register access abstraction backed by transports such as GVCP/GenCP.
6pub trait RegisterIo {
7 /// Read `len` bytes starting at `addr`.
8 fn read(&self, addr: u64, len: usize) -> Result<Vec<u8>, GenApiError>;
9 /// Write `data` starting at `addr`.
10 fn write(&self, addr: u64, data: &[u8]) -> Result<(), GenApiError>;
11}
12
13/// No-op register I/O that returns zeroed data for reads and ignores writes.
14///
15/// Useful for offline XML browsing (WASM, no camera) where register access
16/// is not available. SwissKnife expressions depending only on XML-defined
17/// constants will evaluate correctly; register-backed nodes will return zeros.
18pub struct NullIo;
19
20impl RegisterIo for NullIo {
21 fn read(&self, _addr: u64, len: usize) -> Result<Vec<u8>, GenApiError> {
22 Ok(vec![0u8; len])
23 }
24
25 fn write(&self, _addr: u64, _data: &[u8]) -> Result<(), GenApiError> {
26 Ok(())
27 }
28}