use std::borrow::Cow; use bstr::BStr; use crate::{ file, file::{mutable::section::SectionMut, Index, Size}, lookup, parse::section, }; /// An intermediate representation of a mutable value obtained from a [`File`][crate::File]. #[derive(PartialEq, Eq, Hash, PartialOrd, Ord, Debug)] pub struct ValueMut<'borrow, 'lookup, 'event> { pub(crate) section: SectionMut<'borrow, 'event>, pub(crate) key: section::Key<'lookup>, pub(crate) index: Index, pub(crate) size: Size, } impl<'borrow, 'lookup, 'event> ValueMut<'borrow, 'lookup, 'event> { /// Returns the actual value. This is computed each time this is called /// requiring an allocation for multi-line values. pub fn get(&self) -> Result, lookup::existing::Error> { 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) { 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<'a>(&mut self, input: impl Into<&'a BStr>) { if self.size.0 > 0 { self.section.delete(self.index, self.index + self.size); } self.size = self.section.set_internal(self.index, self.key.to_owned(), input.into()); } /// 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::Section<'event> { &self.section } /// Convert this value into its owning mutable section. pub fn into_section_mut(self) -> file::SectionMut<'borrow, 'event> { self.section } }