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
use std::fs;

use crate::settings::Settings;
use color_eyre::eyre::{Context, Result};

/// Namespace abstraction and metadata
pub struct Namespace {
    /// If the namespace detected is the one currently active in configuration
    pub is_current: bool,
    /// Name of the detected namespace
    pub name: String,
}

/// List all namespaces available in the ecosystem
pub fn list_namespaces(settings: &Settings) -> Result<Vec<Namespace>> {
    let mut namespaces: Vec<Namespace> = vec![];

    // search available namespaces from filesystem
    for entry in fs::read_dir(settings.data.path.clone()).with_context(|| "error while scanning database directory for namespaces")? {
        let entry = entry?;
        if entry.metadata()?.is_dir() {
            let name = entry.file_name().to_str().unwrap().to_string(); // TODO: fix unwrap
            let is_current = if name == settings.namespace { true } else { false };
            namespaces.push(Namespace { is_current, name });
        }
    }

    // if no namespaces found, add the default one and set it active
    if namespaces.len() == 0 {
        namespaces.push(
            Namespace { name: "default".into(), is_current: true }
        );
    }

    Ok(namespaces)
}

// eof