KeyBoxen 0.1.0

Standalone secret-service daemon for window managers
// Copyright (C) 2022 KeyBoxen Authors
// SPDX-License-Identifier: GPL-3.0-or-later

//! Database operations
//!
//! This module deals with database related operations. The database
//! that we use is SQlite - an embedded database. The database is
//! stored in an [XDG compliant location][xdg] (`XDG_DATA_HOME`) by
//! default.
//!
//! TODO: Allow user to specify database
//!
//! [xdg]: https://wiki.archlinux.org/title/XDG_Base_Directory#User_directories

use rusqlite::Connection;
use std::path::{Path, PathBuf};

pub fn connect_db(path: Option<&Path>, create_db: bool) -> Result<Connection, DBError> {
    // Use given path or else select default path
    let path = path
        .unwrap_or(&PathBuf::from("~/.local/share/keyboxen.db"))
        .canonicalize()?;
    // Don't create DB if not asked for
    if !create_db && !path.is_file() {
        Err(DBError::NotFound(PathBuf::from(&path)))?;
    }
    Ok(Connection::open(&path)?)
}

/// Errors that arise during database operations
#[derive(Debug, thiserror::Error)]
pub enum DBError {
    #[error(transparent)]
    PathError(#[from] std::io::Error),
    #[error("DB file '{0}' not found")]
    NotFound(PathBuf),
    #[error(transparent)]
    ConnectError(#[from] rusqlite::Error),
    #[error(transparent)]
    CloseError(rusqlite::Error),
}