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
|
use std::str;
use std::str::Utf8Error;
#[derive(Debug)]
pub struct Request {
msg: String,
}
impl TryFrom<&[u8]> for Request {
type Error = ParsingError;
fn try_from(buf: &[u8]) -> Result<Request, Self::Error> {
// 첫 번째 방법
match str::from_utf8(buf) {
Ok(v) => {
println!("First Ok: {v}");
}
Err(e) => return Err(ParsingError::Invalid),
}
// 두 번째 방법
match str::from_utf8(buf).or(Err(ParsingError::Invalid)) {
Ok(v) => {
println!("Second Ok: {}", v);
}
Err(e) => return Err(e),
}
// 세 번째 방법
let v = str::from_utf8(buf).or(Err(ParsingError::Invalid))?;
println!("Third Ok: {}", v);
// 네 번째 방법: 'impl From<Utf8Error> for ParseError' 구현하여 사용할 수 있다.
let v = str::from_utf8(buf)?;
println!("4th Ok: {}", v);
Ok(Self {
msg: "Ok".to_string(),
})
// 번외(error 발생) - Error 타입이 String일 경우, 정상 동작한다.
//str::from_utf8(buf).map_err(|e| e.to_string())?;
}
}
pub enum ParsingError {
Invalid,
}
// Utf8Error 을 ParsingError 로 변경해주는 From Trait 구현
impl From<Utf8Error> for ParsingError {
fn from(_: Utf8Error) -> Self {
ParsingError::Invalid
}
}
fn main() {
let buf: [u8; 4] = [0xF0, 0x9F, 0x98, 0x81]; //return emoji
//let buf: [u8; 4] = [0xF0, 0x9F, 98, 0x81]; //return error
let result = Request::try_from(&buf[..]);
if let Ok(v) = result {
println!("Output - {:?}", v);
return;
};
println!("Output Error - {:?}", result);
}
|