1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use crate::{db_state::ScndIdxRemovalResult, DB};
use anyhow::Result;
use derive_more::Display;
use pancake_types::types::SubValueSpec;

impl DB {
    pub async fn delete_scnd_idx(
        &self,
        sv_spec: &SubValueSpec,
    ) -> Result<(), ScndIdxDeletionJobErr> {
        {
            let db_state = self.db_state().read().await;

            match db_state.can_scnd_idx_be_removed(sv_spec) {
                ScndIdxRemovalResult::DoesNotExist => return Ok(()),
                ScndIdxRemovalResult::CreationInProgress => {
                    return Err(ScndIdxDeletionJobErr::CreationInProgress)
                }
                ScndIdxRemovalResult::Deletable => {}
            };
        }

        {
            let mut db_state = self.db_state().write().await;

            match db_state.remove_scnd_idx(sv_spec) {
                Err(e) => return Err(ScndIdxDeletionJobErr::InternalError(e)),
                Ok(ScndIdxRemovalResult::DoesNotExist) => return Ok(()),
                Ok(ScndIdxRemovalResult::CreationInProgress) => {
                    return Err(ScndIdxDeletionJobErr::CreationInProgress)
                }
                Ok(ScndIdxRemovalResult::Deletable) => return Ok(()),
            }
        }
    }
}

#[derive(Debug, Display)]
pub enum ScndIdxDeletionJobErr {
    CreationInProgress,
    InternalError(anyhow::Error),
}