Skip to main content

rustdv_sim/handle/
string.rs

1//! String values with scheduled and immediate writes.
2
3use rustdv_gpi as gpi;
4
5use crate::{
6    handle::{HandleBase, ValueError},
7    phase,
8};
9
10/// A string variable. Embedded NUL bytes are rejected by both write paths.
11#[derive(Copy, Clone)]
12pub struct StringHandle {
13    pub(super) raw: gpi::StringHandle,
14}
15
16impl From<gpi::StringHandle> for StringHandle {
17    fn from(raw: gpi::StringHandle) -> Self {
18        StringHandle { raw }
19    }
20}
21
22impl HandleBase for StringHandle {
23    fn name(&self) -> String {
24        self.raw.name()
25    }
26
27    fn full_name(&self) -> String {
28        self.raw.full_name()
29    }
30}
31
32impl StringHandle {
33    pub fn get(&self) -> Result<String, ValueError> {
34        self.raw.get()
35    }
36
37    /// Buffer an owned copy until ReadWrite; the last write wins.
38    pub fn set(&self, value: &str) -> Result<(), ValueError> {
39        phase::deny_write_in_read_only(self.raw);
40        if value.contains('\0') {
41            return Err(ValueError::InteriorNul);
42        }
43        phase::schedule(self.raw, phase::WriteVal::String(value.into()));
44        Ok(())
45    }
46
47    pub fn set_now(&self, value: &str) -> Result<(), ValueError> {
48        phase::deny_write_in_read_only(self.raw);
49        self.raw.set_now(value)
50    }
51}