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
#[derive(Clone, Copy, Debug, PartialEq, Eq, Ord, PartialOrd)]
pub enum IPAddressVersion{
IpV4,
IpV6
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Ord, PartialOrd)]
pub enum ProtocolType{
TCP,
UDP,
WEBSOCKET
}
#[derive(Clone, Debug, PartialEq, Eq, Ord, PartialOrd)]
pub struct AddressParser {
pub ip_address:String,
pub port_no:usize,
pub protocol_type:ProtocolType,
pub ip_version:IPAddressVersion
}
impl AddressParser {
pub fn object_to_string(address_object:AddressParser)->String{
let mut result_str=String::from("/ipv4/");
if address_object.ip_version==IPAddressVersion::IpV6 {
result_str.push_str("/ipv6/");
}
result_str.push_str(&address_object.ip_address);
if address_object.protocol_type==ProtocolType::TCP {
result_str.push_str("/tcp/");
}else{
result_str.push_str("/udp/");
}
result_str.push_str(&address_object.port_no.to_string());
result_str
}
pub fn string_to_object(address_string:String)->AddressParser{
let tmp_arr=address_string.split("/");
let mut tmp_type=ProtocolType::TCP;
let mut tmp_ip_ver=IPAddressVersion::IpV4;
let mut tmp_ip_addr=String::from("0.0.0.0");
let mut tmp_port_no=usize::MIN;
let mut started=false;
let mut count=0;
for part in tmp_arr {
if started==true{
if count==0{
tmp_ip_addr=part.to_string();
}
if count==1{
if part.eq("tcp"){
tmp_type=ProtocolType::TCP;
}
if part.eq("udp"){
tmp_type=ProtocolType::UDP;
}
}
if count==2{
tmp_port_no=part.parse().unwrap_or_default();
}
count=count+1;
}
if part.eq("ipv4"){
tmp_ip_ver=IPAddressVersion::IpV4;
started=true;
}
if part.eq("ipv6"){
tmp_ip_ver=IPAddressVersion::IpV6;
started=true;
}
}
AddressParser{
ip_address:tmp_ip_addr,
port_no:tmp_port_no,
protocol_type:tmp_type,
ip_version:tmp_ip_ver,
}
}
pub fn binding_addr_to_object(local_addr:String, protocol_type:ProtocolType, ip_version:IPAddressVersion)->AddressParser{
let collection = local_addr.split(":").collect::<Vec<&str>>();
AddressParser{
ip_address: collection[0].to_string(),
port_no: collection[1].parse::<usize>().unwrap(),
protocol_type,
ip_version,
}
}
pub fn binding_addr_to_string(local_addr:String, protocol_type:ProtocolType, ip_version:IPAddressVersion)->String{
AddressParser::object_to_string(
AddressParser::binding_addr_to_object(
local_addr,
protocol_type,
ip_version
)
)
}
pub fn local_addr_for_binding(address_object:AddressParser)->String{
let mut bind_str = address_object.ip_address;
bind_str.push_str(":");
bind_str.push_str(&address_object.port_no.to_string());
bind_str
}
}
#[test]
fn full_test() {
let addr_obj=AddressParser{
ip_version: IPAddressVersion::IpV4,
ip_address:"127.0.0.1".to_string(),
port_no:1234,
protocol_type:ProtocolType::TCP
};
let addr_str=AddressParser::object_to_string(addr_obj.clone());
let convert_obj=AddressParser::string_to_object(addr_str.clone());
if addr_obj.eq(&convert_obj.clone()){
assert_eq!(true,true)
}else{
assert_eq!(false,true)
}
}