Skip to main content

goxoy_address_parser/
address_parser.rs

1// https://blog.guillaume-gomez.fr/articles/2020-03-12+Guide+on+how+to+write+documentation+for+a+Rust+crate
2//#![warn(missing_docs)]
3#![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    // cargo test  --lib full_test -- --nocapture
128    
129    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 local_addr_for_socket=AddressParser::local_addr_for_binding(addr_obj.clone());
138    //println!("local_addr_for_socket: {}",local_addr_for_socket.clone());
139
140    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