当前位置: 首页 > news >正文

0282-KVS-使用 anyhow 处理错误

环境

  • Time 2022-12-11
  • WSL-Ubuntu 22.04
  • Rust 1.65.0

前言

说明

参考:https://github.com/pingcap/talent-plan

目标

在上一节的基础上,新增 anyhow 依赖,处理代码中的错误。

Cargo.toml

[package]
edition = "2021"
name = "kvs"
version = "1.0.0"[dependencies]
anyhow = "1"
clap = {version = "4", features = ["derive"]}
serde = {version = "1", features = ["derive"]}
serde_json = "1"

main.rs

use clap::{Parser, Subcommand};
use kvs::KvStore;#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Cli {#[command(subcommand)]command: Commands,
}#[derive(Subcommand)]
enum Commands {/// 设置值Set {/// 键key: String,/// 值value: String,},/// 获取值Get {/// 键key: String,},/// 删除值Rm {/// 键key: String,},
}fn main() -> anyhow::Result<()> {let cli = Cli::parse();let mut store = KvStore::new()?;match cli.command {Commands::Set { key, value } => {if let Some(value) = store.set(key.to_string(), value)? {println!("SET KEY: {key}, VALUE: {value}");} else {println!("SET KEY: {key}, VALUE: None");}}Commands::Get { key } => {if let Some(value) = store.get(&key)? {println!("GET KEY: {key}, VALUE: {value}");} else {println!("GET KEY: {key}, VALUE: None");}}Commands::Rm { key } => {if let Some(value) = store.remove(key.to_string())? {println!("REM KEY: {key}, VALUE: {value}");} else {println!("REM KEY: {key}, VALUE: None");}}}Ok(())
}

lib.rs

use anyhow::Result;
use log::CommandLog;mod cmd;
mod log;pub struct KvStore {log: CommandLog,
}impl KvStore {pub fn new() -> Result<KvStore> {Ok(Self {log: CommandLog::new()?,})}pub fn get(&mut self, key: &str) -> Result<Option<String>> {self.log.get(key)}pub fn set(&mut self, key: String, value: String) -> Result<Option<String>> {self.log.set(key, value)}pub fn remove(&mut self, key: String) -> Result<Option<String>> {self.log.remove(key)}
}

log.rs

use std::collections::HashMap;
use std::fs::{File, OpenOptions};
use std::io::{BufReader, BufWriter, Write};use anyhow::{Ok, Result};
use serde_json::Deserializer;use crate::cmd::Command;pub(crate) struct CommandLog {writer: BufWriter<File>,map: HashMap<String, String>,
}impl CommandLog {pub(crate) fn new() -> Result<Self> {let path = "/root/log/1.log";let writer = new_writer(path)?;let mut map = HashMap::default();load(path, &mut map)?;Ok(Self { writer, map })}pub(crate) fn get(&mut self, key: &str) -> Result<Option<String>> {Ok(self.map.get(key).map(String::from))}pub(crate) fn set(&mut self, key: String, value: String) -> Result<Option<String>> {let command = Command::Set { key, value };let json = serde_json::to_string(&command)?;self.writer.write_all(json.as_bytes())?;Ok(None)}pub(crate) fn remove(&mut self, key: String) -> Result<Option<String>> {let command = Command::Remove { key };let json = serde_json::to_string(&command)?;self.writer.write_all(json.as_bytes())?;Ok(None)}
}fn new_writer(path: &str) -> Result<BufWriter<File>> {let file = OpenOptions::new().append(true).create(true).open(path)?;Ok(BufWriter::new(file))
}fn load(path: &str, map: &mut HashMap<String, String>) -> Result<()> {let stream = Deserializer::from_reader(new_reader(path)?).into_iter();for cmd in stream {match cmd? {Command::Set { key, value } => map.insert(key, value),Command::Remove { key } => map.remove(&key),};}Ok(())
}fn new_reader(path: &str) -> Result<BufReader<File>> {let file = OpenOptions::new().read(true).open(path)?;Ok(BufReader::new(file))
}

总结

使用 anyhow 来处理程序中遇到的错误。

附录

http://www.rkmt.cn/news/31363.html

相关文章:

  • 2025年口碑好的搜荐系统公司、2025年搜荐系统服务商、专业的搜荐系统平台、搜荐系统公司推荐、搜荐系统服务口碑推荐全面解析
  • Playwright for Python 的基本使用与常用交互API-使用笔记
  • 5款能帮你自动做PPT的AI工具,我全都试过了,最好用的是它!
  • 大模型训练
  • 2025 年无缝钢管厂家最新推荐榜,技术实力与市场口碑深度解析Q355E/20G/12Cr1MoVG/15CrMoG/20CrMnTi/16MnDG 无缝钢管公司推荐
  • 2025年北京离婚房产律所权威推荐榜单:婚姻/离婚/离婚事务所专业律师团队精选
  • 魔改最短路
  • 解决 c# 同步方法调用异步方法,使用 .Result 导致死锁问题
  • 2025 年路灯厂家最新推荐榜单:结合照明电器协会测评数据,精选市政 / 景观 / 太阳能等多场景优质路灯企业
  • 2025年想降本?项目进度管理软件至少帮你省20%人力成本!
  • 何为受控组件(controlledcomponent) ?
  • Java 开发开篇
  • 深入解析:Node.js 完全安装与使用指南:Windows 平台详细教程
  • 2025 年液位计厂家最新推荐榜,深度解析行业头部品牌技术实力与市场口碑
  • 2025 年减速机厂家最新推荐榜,技术实力与市场口碑深度解析行星/直角换向器/中空旋转平台减速机厂家推荐
  • 2025 年连接器厂家最新推荐榜:优质品牌全方位解析,含 M8/M12 / 防水等品类测评结果
  • 选择电流探头时是看峰峰值还是最大值?
  • Java dubbo spring springboot中的spi机制
  • Oracle Data Pump 网络模式直接迁移详解(使用数据库链接(Database Link))
  • 2025年10月防脱生发产品推荐:十款口碑榜对比与临床数据全解析
  • 2025年10月法律咨询律所推荐榜:盈科律所规模与专业度双领先
  • 2025年10月税务专家邵立推荐榜:财税破局者年度评价
  • 2025 年娱乐麦克风,一拖二无线麦克风,舞台演出麦克风厂家最新推荐,技术实力与市场口碑深度解析
  • 完整教程:Redis 是如何实现消息队列的?
  • 微软-SQLServer-2012-和-Hadoop-全-
  • 矢量图
  • 2025 年电驱动厂家最新推荐排行榜:依托国家智能测控系统产业计量测试联盟测评数据,精选伺服电机、新能源汽车电机等领域优质品牌
  • 2025 年减速器源头厂家最新推荐榜:RV / 精密 / 通用减速器测试品牌技术实力权威测评
  • 2025 年阳台光伏厂家最新推荐榜:技术实力与市场口碑深度解析,含逆变器/储能/光伏板优质企业
  • 折旧分配表点击修改按钮报错,软件卡死