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}