goxoy_address_parser/
address_parser.rs1#![warn(missing_doc_code_examples)]
4#[derive(Clone, Copy, Debug, PartialEq, Eq, Ord, PartialOrd)]
5pub enum IPAddressVersion{
6 IpV4,
7 IpV6
8}
9#[derive(Clone, Copy, Debug, PartialEq, Eq, Ord, PartialOrd)]
10pub enum ProtocolType{
11 TCP,
12 UDP,
13 WEBSOCKET
14}
15
16#[derive(Clone, Debug, PartialEq, Eq, Ord, PartialOrd)]
17pub struct AddressParser {
18 pub ip_address:String,
19 pub port_no:usize,
20 pub protocol_type:ProtocolType,
21 pub ip_version:IPAddressVersion
22}
23
24pub trait AddressParserConverter {
25 fn to_address_parser_object(&self) -> AddressParser;
26}
27impl AddressParserConverter for str {
28 fn to_address_parser_object(&self) -> AddressParser {
29 AddressParser::string_to_object(self.clone().to_string())
30 }
31}
32
33pub trait AddressParserConverterForString {
34 fn to_address_parser_object(&self) -> AddressParser;
35}
36impl AddressParserConverterForString for String {
37 fn to_address_parser_object(&self) -> AddressParser {
38 AddressParser::string_to_object(self.clone())
39 }
40}
41
42impl AddressParser {
43 pub fn object_to_string(address_object:AddressParser)->String{
44 let mut result_str=String::from("/ipv4/");
45 if address_object.ip_version==IPAddressVersion::IpV6 {
46 result_str.push_str("/ipv6/");
47 }
48 result_str.push_str(&address_object.ip_address);
49 if address_object.protocol_type==ProtocolType::TCP {
50 result_str.push_str("/tcp/");
51 }else{
52 result_str.push_str("/udp/");
53 }
54 result_str.push_str(&address_object.port_no.to_string());
55 result_str
56 }
57 pub fn string_to_object(address_string:String)->AddressParser{
58 let tmp_arr=address_string.split("/");
59 let mut tmp_type=ProtocolType::TCP;
60 let mut tmp_ip_ver=IPAddressVersion::IpV4;
61 let mut tmp_ip_addr=String::from("0.0.0.0");
62 let mut tmp_port_no=usize::MIN;
63 let mut started=false;
64 let mut count=0;
65 for part in tmp_arr {
66 if started==true{
67 if count==0{
68 tmp_ip_addr=part.to_string();
69 }
70 if count==1{
71 if part.eq("tcp"){
72 tmp_type=ProtocolType::TCP;
73 }
74 if part.eq("udp"){
75 tmp_type=ProtocolType::UDP;
76 }
77 }
78 if count==2{
79 tmp_port_no=part.parse().unwrap_or_default();
80 }
81 count=count+1;
82 }
83 if part.eq("ipv4"){
84 tmp_ip_ver=IPAddressVersion::IpV4;
85 started=true;
86 }
87 if part.eq("ipv6"){
88 tmp_ip_ver=IPAddressVersion::IpV6;
89 started=true;
90 }
91 }
92 AddressParser{
93 ip_address:tmp_ip_addr,
94 port_no:tmp_port_no,
95 protocol_type:tmp_type,
96 ip_version:tmp_ip_ver,
97 }
98 }
99 pub fn binding_addr_to_object(local_addr:String, protocol_type:ProtocolType, ip_version:IPAddressVersion)->AddressParser{
100 let collection = local_addr.split(":").collect::<Vec<&str>>();
101 AddressParser{
102 ip_address: collection[0].to_string(),
103 port_no: collection[1].parse::<usize>().unwrap(),
104 protocol_type,
105 ip_version,
106 }
107 }
108 pub fn binding_addr_to_string(local_addr:String, protocol_type:ProtocolType, ip_version:IPAddressVersion)->String{
109 AddressParser::object_to_string(
110 AddressParser::binding_addr_to_object(
111 local_addr,
112 protocol_type,
113 ip_version
114 )
115 )
116 }
117 pub fn local_addr_for_binding(address_object:AddressParser)->String{
118 let mut bind_str = address_object.ip_address;
119 bind_str.push_str(":");
120 bind_str.push_str(&address_object.port_no.to_string());
121 bind_str
122 }
123}
124
125#[test]
126fn full_test() {
127 let addr_obj=AddressParser{
130 ip_version: IPAddressVersion::IpV4,
131 ip_address:"127.0.0.1".to_string(),
132 port_no:1234,
133 protocol_type:ProtocolType::TCP
134 };
135 let addr_str=AddressParser::object_to_string(addr_obj.clone());
136
137 let convert_obj=AddressParser::string_to_object(addr_str.clone());
141
142 if addr_obj.eq(&convert_obj.clone()){
143 assert_eq!(true,true)
144 }else{
145 assert_eq!(false,true)
146 }
147}
148