libfrugalos/
expect.rs

1//! Compare-And-Swap用の構成要素。
2use entity::object::ObjectVersion;
3use {ErrorKind, Result};
4
5/// 操作対象オブジェクトに期待するバージョンを表現するためのデータ構造.
6#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
7pub enum Expect {
8    /// 任意のバージョンに対して適用可能.
9    Any,
10
11    /// オブジェクトが既に存在しない場合にのみ適用可能.
12    None,
13
14    /// 指定バージョンのオブジェクトに対してのみ適用可能.
15    IfMatch(Vec<ObjectVersion>),
16
17    /// オブジェクトのバージョンが指定のもの以外の場合にのみ適用可能.
18    IfNoneMatch(Vec<ObjectVersion>),
19}
20impl Expect {
21    /// 引数で指定されたバージョンが、期待するものかどうかを検証する。
22    pub fn validate(&self, version: Option<ObjectVersion>) -> Result<()> {
23        match *self {
24            Expect::Any => {}
25            Expect::None => track_assert_eq!(version, None, ErrorKind::Unexpected(version)),
26            Expect::IfMatch(ref versions) => track_assert!(
27                versions.iter().any(|&v| Some(v) == version),
28                ErrorKind::Unexpected(version)
29            ),
30            Expect::IfNoneMatch(ref versions) => track_assert!(
31                versions.iter().all(|&v| Some(v) != version),
32                ErrorKind::Unexpected(version)
33            ),
34        }
35        Ok(())
36    }
37}
38impl Default for Expect {
39    fn default() -> Self {
40        Expect::Any
41    }
42}