| 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<Cow<'_, BStr>, 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<str>) { |
| 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 |
| } |
| } |