1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use crate::error::Error;
use crate::extension::JsonMapExt;
use crate::{JsonMap, SharedString};

/// 记录验证结果中的异常条目
#[derive(Debug, Default)]
pub struct Validation {
    failed_entries: Vec<(SharedString, Error)>,
}

impl Validation {
    /// 创建一个新实例
    #[inline]
    pub fn new() -> Self {
        Self {
            failed_entries: Vec::new(),
        }
    }

    /// 通过键值对创建实例
    pub fn from_entry(key: impl Into<SharedString>, err: impl Into<Error>) -> Self {
        let failed_entries = vec![(key.into(), err.into())];
        Self { failed_entries }
    }

    /// 通过错误消息添加验证异常记录
    #[inline]
    pub fn add(&mut self, key: impl Into<SharedString>, message: impl Into<SharedString>) {
        self.failed_entries.push((key.into(), Error::new(message)));
    }

    /// 通过错误数据
    #[inline]
    pub fn add_fail(&mut self, key: impl Into<SharedString>, err: impl Into<Error>) {
        self.failed_entries.push((key.into(), err.into()));
    }

    /// 如果包含指定键值的异常数据,则返回 `true`
    #[inline]
    pub fn is_contain_key(&self, key: &str) -> bool {
        self.failed_entries.iter().any(|(f, _)| f == key)
    }

    /// 如果没有任何异常条目,则返回`true`
    #[inline]
    pub fn is_success(&self) -> bool {
        self.failed_entries.is_empty()
    }

    /// 将验证结构转换为 `edm-core::JsonMap<String,JsonValue>`对象
    #[must_use]
    pub fn into_json_map(self) -> JsonMap {
        let failed_entries = self.failed_entries;
        let mut map = JsonMap::with_capacity(failed_entries.len());
        for (key, err) in failed_entries {
            map.upsert(key, err.to_string());
        }
        map
    }
}