ys memos

Blog

Rustで簡単なKVSを実装してみた ~1. 型定義など~


rust

2023/11/04


  1. 概要
  2. 型定義など
  3. handler定義
  4. Query定義
  5. KvsServer実装
  6. main&使ってみる

ここでは、thiserrorを用いた多様なエラー型の?を用いたハンドリングを含んでいる。


プロジェクト全体にまたがって利用する型定義などを記載する



Storeという名前でKVSのデータ保存対象の型を型エイリアスとして持つこととした。これによって、データストアの型をパッと見でわかるコード配置の実現、開発時の手数削減、型の明示性を目指した。

実際には現在の規模のコードでは型エイリアスにとどめているが、プロジェクトの規模増大やメソッドの増加に伴って正式な型として実装する基準を持っておくと良いと考えられる。

今回型エイリアスにしたのは、メソッドによる処理の共通化の余地がなかったため決定した。 仮に値取得や書込のバリエーションが増える場合は、Storeに対するメソッドとして共通化のため、型エイリアスではなく正式に構造体とすることが望ましい。

src/types.rs
pub type Store = std::collections::HashMap<String, String>;

毎度お馴染みのthiserrorを使った、多様なエラーの楽なハンドリングを定義しておく。未実装エラーへの対処が必要になるたびにこのenumに新たなバリアントを追加する形で利用する。そのため、プロジェクト内の他のモジュールよりも上位の、 main.rsと同列に並べるものとした。

ここでは、レスポンスに渡すメッセージをバリアントに含めてもいる。 仮に内部実装とレスポンスを分離したくなれば、別のenumとして定義することも視野に入る。

src/error.rs
use std::io;
use thiserror::Error;

pub type KvsResult<T> = Result<T, KvsError>;

#[derive(Error, Debug)]
pub enum KvsError {
    #[error("stream error {0:?}")]
    StreamError(#[from] io::Error),

    #[error("invalid utf8 string")]
    InvalidUtf8String(#[from] std::string::FromUtf8Error),

    #[error("stream disconnected")]
    StreamDisconnected,

    #[error("key not found: {0:?}")]
    KeyNotFound(String),

    #[error("Invalid Method Name: {0:?}")]
    InvalidMethodName(String),

    #[error("must to have space: <method> <key> <...args>")]
    InvalidQueryFormat,

    #[error("method must to have {0:?} payloads")]
    InvalidPayloadSize(usize),
}

0.概要#おわりにに集約します。


0.概要#参考に集約します。

関連タグを探す