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
61
62
63
64
65
66
67
68
69
70
71
72
73
use crate::SilentError;
use uuid::Uuid;

/// 路由参数
/// 支持类型:
///     String(String)
///     Int(i32),
///     Uuid(Uuid),
///     Path(String),
/// 支持数据转换
#[derive(Debug, PartialEq)]
pub enum PathParam {
    /// 字符串类型参数
    String(String),
    /// 整型参数
    Int(i32),
    /// Uuid类型参数
    Uuid(Uuid),
    /// 路径参数
    Path(String),
}

impl From<String> for PathParam {
    fn from(s: String) -> Self {
        PathParam::String(s)
    }
}

impl From<i32> for PathParam {
    fn from(i: i32) -> Self {
        PathParam::Int(i)
    }
}

impl From<Uuid> for PathParam {
    fn from(u: Uuid) -> Self {
        PathParam::Uuid(u)
    }
}

impl<'a> TryFrom<&'a PathParam> for i32 {
    type Error = SilentError;

    fn try_from(value: &'a PathParam) -> Result<Self, Self::Error> {
        match value {
            PathParam::Int(value) => Ok(*value),
            _ => Err(SilentError::ParamsNotFound),
        }
    }
}

impl<'a> TryFrom<&'a PathParam> for String {
    type Error = SilentError;

    fn try_from(value: &'a PathParam) -> Result<Self, Self::Error> {
        match value {
            PathParam::String(value) => Ok(value.clone()),
            PathParam::Path(value) => Ok(value.clone()),
            _ => Err(SilentError::ParamsNotFound),
        }
    }
}

impl<'a> TryFrom<&'a PathParam> for Uuid {
    type Error = SilentError;

    fn try_from(value: &'a PathParam) -> Result<Self, Self::Error> {
        match value {
            PathParam::Uuid(value) => Ok(*value),
            _ => Err(SilentError::ParamsNotFound),
        }
    }
}