Работа с внешним состоянием

Данная часть рассматривает модуль state.rs, который будет содержать в себе типы, используемые для работы с не-GTK внешним состоянием. Это будет очень просто, потому что Markdown-редактор не хранит большой объем данных во внешнем хранилище.

Что нам нужно?

Имеются два ключевых компонента, которые должны нас заботить в течение времени жизни программы

  • путь к редактируемому файлу
  • хеш-сумма содержимого файла для сравнения текущего содержимого редактора с содержимым файла для того чтобы знать, когда активировать/деактивировать кнопку Save.

ActiveMetadata

Так появилась структура ActiveMetadata. Она содержит PathBuf, используемый для хранения пути к редактируемому файлу, и 64-байтный хеш, который будет сгенерирован функцией keccak512() из пакета tiny-keccak


# #![allow(unused_variables)]
#fn main() {
use std::path::{Path, PathBuf};
use tiny_keccak::keccak512;

pub struct ActiveMetadata {
    path: PathBuf,
    sum:  [u8; 64],
}
#}

Реализация методов для этого типа будет простой. Мы должны создать:

  • новый экземпляр метаданных
  • функцию для получения ссылки на путь к файлу
  • функцию для проверки того, что хеш-сумма содержимого в редакторе такая же, как и хранимая в структуре, функцию для обновления значения хеш-суммы при сохранении файла

# #![allow(unused_variables)]
#fn main() {
impl ActiveMetadata {
    pub fn new(path: PathBuf, data: &[u8]) -> ActiveMetadata {
        ActiveMetadata { path, sum: keccak512(data) }
    }

    pub fn get_path<'a>(&'a self) -> &'a Path { &self.path }

    pub fn get_dir(&self) -> Option<PathBuf> { self.path.parent().map(|p| p.to_path_buf()) }

    pub fn is_same_as(&self, data: &[u8]) -> bool { &keccak512(data)[..] == &self.sum[..] }

    pub fn set_sum(&mut self, data: &[u8]) { self.sum = keccak512(data); }
}
#}