use bstr::BString; use crate::{ file, file::{Index, Size, mutable::section::SectionMut}, lookup, parse::section, }; /// An intermediate representation of a mutable value obtained from a [`File`][crate::File]. #[derive(Debug)] pub struct ValueMut<'borrow> { pub(crate) section: SectionMut<'borrow>, pub(crate) key: section::ValueName, pub(crate) index: Index, pub(crate) size: Size, } impl<'borrow> ValueMut<'borrow> { /// Returns the actual value. This is computed each time this is called /// requiring an allocation for multi-line values. pub fn get(&self) -> Result { self.section.get(&self.key, self.index, self.index + self.size) } /// Update the value to the provided one. This modifies the value such that /// the Value event(s) are replaced with a single new event containing the /// new value. pub fn set_string(&mut self, input: impl AsRef) -> Result<(), crate::parse::span::Error> { self.set(input.as_ref()) } /// Update the value to the provided one. This modifies the value such that /// the Value event(s) are replaced with a single new event containing the /// new value. pub fn set(&mut self, input: impl crate::AsBStr) -> Result<(), crate::parse::span::Error> { let new_size = self .section .set_internal(self.index, self.key.to_owned(), input.as_bstr())?; if self.size.0 > 0 { self.section .delete(self.index + new_size, self.index + new_size + self.size); } self.size = new_size; Ok(()) } /// Removes the value. Does nothing when called multiple times in /// succession. pub fn delete(&mut self) { if self.size.0 > 0 { self.section.delete(self.index, self.index + self.size); self.size = Size(0); } } /// Return the section containing the value. pub fn section(&self) -> file::SectionRef<'_> { self.section.section() } /// Convert this value into its owning mutable section. pub fn into_section_mut(self) -> file::SectionMut<'borrow> { self.section } }