tui-journal 0.18.0

Tui app allows writing and managing journals/notes from within the terminal With different local back-ends
Documentation
use backend::ModifyEntryError;

use super::*;

#[derive(Default)]
pub struct MockDataProvider {
    entries: Vec<Entry>,
    return_error: bool,
}

impl MockDataProvider {
    pub fn new_with_data() -> Self {
        MockDataProvider {
            entries: get_default_entries(),
            return_error: false,
        }
    }

    pub fn set_return_err(&mut self, return_error: bool) {
        self.return_error = return_error
    }

    fn early_return(&self) -> anyhow::Result<()> {
        match self.return_error {
            true => bail!("Test Error"),
            false => Ok(()),
        }
    }
}

impl DataProvider for MockDataProvider {
    async fn load_all_entries(&mut self) -> anyhow::Result<Vec<Entry>> {
        self.early_return()?;

        Ok(self.entries.clone())
    }

    async fn add_entry(&mut self, entry: EntryDraft) -> Result<Entry, ModifyEntryError> {
        self.early_return()?;
        let new_id = self
            .entries
            .iter()
            .map(|entry| entry.id + 1)
            .max()
            .unwrap_or(0);

        let entry = Entry::from_draft(new_id, entry);

        self.entries.push(entry.clone());

        Ok(entry)
    }

    async fn restore_entry(&mut self, entry: Entry) -> Result<Entry, ModifyEntryError> {
        self.early_return()?;

        if self.entries.iter().any(|existing| existing.id == entry.id) {
            return Err(ModifyEntryError::ValidationError(format!(
                "Entry id {} already exists",
                entry.id
            )));
        }

        self.entries.push(entry.clone());

        Ok(entry)
    }

    async fn remove_entry(&mut self, entry_id: u32) -> anyhow::Result<()> {
        self.early_return()?;

        self.entries.retain(|entry| entry.id != entry_id);

        Ok(())
    }

    async fn update_entry(&mut self, entry: Entry) -> Result<Entry, ModifyEntryError> {
        self.early_return()?;

        let entry_to_change = self
            .entries
            .iter_mut()
            .find(|existing| existing.id == entry.id)
            .ok_or(anyhow!("No item found"))?;

        *entry_to_change = entry.clone();

        Ok(entry)
    }

    async fn get_export_object(&mut self, entries_ids: &[u32]) -> anyhow::Result<EntriesDTO> {
        self.early_return()?;

        Ok(EntriesDTO::new(
            self.entries
                .iter()
                .filter(|entry| entries_ids.contains(&entry.id))
                .cloned()
                .map(EntryDraft::from_entry)
                .collect(),
        ))
    }

    async fn import_entries(&mut self, entries_dto: EntriesDTO) -> anyhow::Result<()> {
        self.early_return()?;

        for draft in entries_dto.entries {
            self.add_entry(draft).await?;
        }

        Ok(())
    }

    async fn assign_priority_to_entries(&mut self, _priority: u32) -> anyhow::Result<()> {
        unimplemented!("There are not tests for assigning priority on the app level");
    }
}