minkv 0.3.0

一个轻量级持久化键值存储,支持内存和文件后端,提供 CLI 和 TCP 服务器
Documentation
use clap::{Parser, Subcommand};
use crate::store::KvStore;

const STORE_PATH: &str = "store.json";

/// 简单键值存储命令行工具。
///
/// 支持 `get`、`set`、`remove` 三个子命令,数据持久化到当前目录的 `store.json`。
#[derive(Parser)]
#[command(name = "minkv")]
#[command(about = "一个轻量级持久化键值存储", long_about = None)]
pub struct Cli {
    #[command(subcommand)]
    pub command: Commands,
}

/// 可用的子命令。
#[derive(Subcommand)]
pub enum Commands {
    /// 获取指定键的值,若不存在则返回错误。
    Get {
        /// 键名
        key: String,
    },
    /// 设置键值对,若键已存在则覆盖。
    Set {
        /// 键名
        key: String,
        /// 键值
        value: String,
    },
    /// 删除指定键。
    Remove {
        /// 要删除的键名
        key: String,
    },
}

/// 解析命令行参数并执行相应操作,错误时打印信息并以非零退出码退出。
pub fn run() {
    let cli = Cli::parse();
    let mut store = KvStore::open(STORE_PATH);

    match cli.command {
        Commands::Get { key } => {
            match store.get(&key) {
                Some(value) => println!("{}", value),
                None => {
                    eprintln!("键不存在: {}", key);
                    std::process::exit(1);
                }
            }
        }
        Commands::Set { key, value } => {
            store.set(key, value);
            println!("OK");
        }
        Commands::Remove { key } => {
            if store.remove(&key).is_none() {
                eprintln!("键不存在: {}", key);
                std::process::exit(1);
            }
            println!("OK");
        }
    }
}