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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
use formatx::formatx;

pub trait IMsgContentValue {
    /// Форматирование значения c заданным форматом
    fn fmt_value(&self, template: &str) -> String;
}

/// Форматирование примитивных типов с помощью библиотеки `formatx`. Есть ограничения. Возможно
/// найдется более универсальный вариант
fn format_with_formatx<TValue>(value: &TValue, template: &str) -> String
where
    TValue: std::fmt::Debug + std::fmt::Display,
{
    let res = formatx!(template, value);
    match res {
        Ok(val) => val,
        Err(err) => err.to_string(),
    }
}

impl IMsgContentValue for () {
    fn fmt_value(&self, _template: &str) -> String {
        String::from("")
    }
}

impl IMsgContentValue for bool {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for std::time::Duration {
    fn fmt_value(&self, _template: &str) -> String {
        format!("{:?}", self)
    }
}

impl IMsgContentValue for f32 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for f64 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for i8 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for i16 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for i32 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for i64 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for i128 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for isize {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for rgb::RGB8 {
    fn fmt_value(&self, _template: &str) -> String {
        format!("{}", self)
    }
}

impl IMsgContentValue for String {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for u8 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for u16 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for u32 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for u64 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for u128 {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}

impl IMsgContentValue for usize {
    fn fmt_value(&self, template: &str) -> String {
        format_with_formatx(self, template)
    }
}