Skip to content

Commit 2ecf767

Browse files
authored
Introdced Function to get IP Address in integer format
1 parent 55641c7 commit 2ecf767

File tree

6 files changed

+132
-73
lines changed

6 files changed

+132
-73
lines changed

README.md

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -61,43 +61,54 @@ The repository contains 2 folder. The first one *Rust_ipify_lib* contains the so
6161
The example is provided under the `Rust_ipify_lib_test/src/` folder.
6262
The file contains an example of usage of the API of the library to retrive the global IP:
6363

64-
65-
extern crate ipify_lib;
66-
use ipify_lib::ipify::get_ip_json;
67-
use ipify_lib::ipify::get_ip_string;
68-
use ipify_lib::ipify::get_ip4_json;
69-
use ipify_lib::ipify::get_ip4_string;
64+
extern crate rust_ipify;
65+
use rust_ipify::ipify::get_ip_json;
66+
use rust_ipify::ipify::get_ip_string;
67+
use rust_ipify::ipify::get_ip4_json;
68+
use rust_ipify::ipify::get_ip4_string;
69+
use rust_ipify::ipify::get_ip4_i32;
70+
use rust_ipify::ipify::get_ip_i128;
71+
7072
fn main() {
71-
println!("inside main of test ");
73+
println!("inside main of test ");
7274

73-
let result_ip64_json = get_ip_json();
75+
let result_ip64_json = get_ip_json();
7476

75-
match result_ip64_json {
76-
Ok(r) => println!("Result IP ( JSON ): \n{:#?}\n", r),
77-
Err(e) => println!("error in request {:?}", e),
78-
}
77+
match result_ip64_json {
78+
Ok(r) => println!("Result IP ( JSON ): \n{:#?}\n", r),
79+
Err(e) => println!("error in request {:?}", e),
80+
}
7981

80-
let result_ip64_string = get_ip_string();
81-
match result_ip64_string {
82-
Ok(r) => println!("Result IP ( String ): \n\t{:#?}\n", r),
83-
Err(e) => println!("error in request {:?}", e),
84-
}
82+
let result_ip64_string = get_ip_string();
83+
match result_ip64_string {
84+
Ok(r) => println!("Result IP ( String ): \n\t{:#?}\n", r),
85+
Err(e) => println!("error in request {:?}", e),
86+
}
8587

86-
let result_ip4_json = get_ip4_json();
88+
let result_ip4_json = get_ip4_json();
8789

88-
match result_ip4_json {
89-
Ok(r) => println!("Result IP v4 ( JSON ): \n{:#?}\n", r),
90-
Err(e) => println!("error in request {:?}", e),
91-
}
90+
match result_ip4_json {
91+
Ok(r) => println!("Result IP v4 ( JSON ): \n{:#?}\n", r),
92+
Err(e) => println!("error in request {:?}", e),
93+
}
9294

93-
let result_ip4_string = get_ip4_string();
94-
match result_ip4_string {
95-
Ok(r) => println!("Result IP v4 ( String ): \n\t{:#?}\n", r),
96-
Err(e) => println!("error in request {:?}", e),
97-
}
95+
let result_ip4_string = get_ip4_string();
96+
match result_ip4_string {
97+
Ok(r) => println!("Result IP v4 ( String ): \n\t{:#?}\n", r),
98+
Err(e) => println!("error in request {:?}", e),
99+
}
100+
101+
let result_ip4_i32 = get_ip4_i32();
102+
match result_ip4_i32 {
103+
Ok(r) => println!("Result IP v4 ( i32 ): \n\t{:#?}\n", r),
104+
Err(e) => println!("error in request {:?}", e),
105+
}
106+
107+
let result_ip_i128 = get_ip_i128();
108+
match result_ip_i128 {
109+
Ok(r) => println!("Result IP ( i128 ): \n\t{:#?}\n", r),
110+
Err(e) => println!("error in request {:?}", e),
98111
}
99-
100-
101112

102113
## How to contribute
103114
[![GitHub contributors](https://img.shields.io/github/contributors/ZigRazor/rust_ipify.svg)](https://GitHub.com/ZigRazor/rust_ipify/graphs/contributors/)

Rust_ipify_lib/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rust_ipify"
3-
version = "1.0.2"
3+
version = "1.1.0"
44
authors = ["ZigRazor"]
55
edition = "2018"
66
license-file = "LICENSE"
@@ -11,4 +11,5 @@ readme = "README.md"
1111
keywords = ["ipify", "ip","internet", "library"]
1212
categories = ["api-bindings", "development-tools","web-programming"]
1313
[dependencies]
14-
reqwest = { version = "0.11", features = ["blocking","json"] }
14+
reqwest = { version = "0.11", features = ["blocking","json"] }
15+
regex = "1"

Rust_ipify_lib/README.md

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -55,43 +55,54 @@ The repository contains 2 folder. The first one *Rust_ipify_lib* contains the so
5555
The example is provided under the `Rust_ipify_lib_test/src/` folder.
5656
The file contains an example of usage of the API of the library to retrive the global IP:
5757

58-
59-
extern crate ipify_lib;
60-
use ipify_lib::ipify::get_ip_json;
61-
use ipify_lib::ipify::get_ip_string;
62-
use ipify_lib::ipify::get_ip4_json;
63-
use ipify_lib::ipify::get_ip4_string;
58+
extern crate rust_ipify;
59+
use rust_ipify::ipify::get_ip_json;
60+
use rust_ipify::ipify::get_ip_string;
61+
use rust_ipify::ipify::get_ip4_json;
62+
use rust_ipify::ipify::get_ip4_string;
63+
use rust_ipify::ipify::get_ip4_i32;
64+
use rust_ipify::ipify::get_ip_i128;
65+
6466
fn main() {
65-
println!("inside main of test ");
67+
println!("inside main of test ");
6668

67-
let result_ip64_json = get_ip_json();
69+
let result_ip64_json = get_ip_json();
6870

69-
match result_ip64_json {
70-
Ok(r) => println!("Result IP ( JSON ): \n{:#?}\n", r),
71-
Err(e) => println!("error in request {:?}", e),
72-
}
71+
match result_ip64_json {
72+
Ok(r) => println!("Result IP ( JSON ): \n{:#?}\n", r),
73+
Err(e) => println!("error in request {:?}", e),
74+
}
75+
76+
let result_ip64_string = get_ip_string();
77+
match result_ip64_string {
78+
Ok(r) => println!("Result IP ( String ): \n\t{:#?}\n", r),
79+
Err(e) => println!("error in request {:?}", e),
80+
}
7381

74-
let result_ip64_string = get_ip_string();
75-
match result_ip64_string {
76-
Ok(r) => println!("Result IP ( String ): \n\t{:#?}\n", r),
77-
Err(e) => println!("error in request {:?}", e),
78-
}
82+
let result_ip4_json = get_ip4_json();
7983

80-
let result_ip4_json = get_ip4_json();
84+
match result_ip4_json {
85+
Ok(r) => println!("Result IP v4 ( JSON ): \n{:#?}\n", r),
86+
Err(e) => println!("error in request {:?}", e),
87+
}
8188

82-
match result_ip4_json {
83-
Ok(r) => println!("Result IP v4 ( JSON ): \n{:#?}\n", r),
84-
Err(e) => println!("error in request {:?}", e),
85-
}
89+
let result_ip4_string = get_ip4_string();
90+
match result_ip4_string {
91+
Ok(r) => println!("Result IP v4 ( String ): \n\t{:#?}\n", r),
92+
Err(e) => println!("error in request {:?}", e),
93+
}
8694

87-
let result_ip4_string = get_ip4_string();
88-
match result_ip4_string {
89-
Ok(r) => println!("Result IP v4 ( String ): \n\t{:#?}\n", r),
90-
Err(e) => println!("error in request {:?}", e),
91-
}
95+
let result_ip4_i32 = get_ip4_i32();
96+
match result_ip4_i32 {
97+
Ok(r) => println!("Result IP v4 ( i32 ): \n\t{:#?}\n", r),
98+
Err(e) => println!("error in request {:?}", e),
9299
}
93-
94-
100+
101+
let result_ip_i128 = get_ip_i128();
102+
match result_ip_i128 {
103+
Ok(r) => println!("Result IP ( i128 ): \n\t{:#?}\n", r),
104+
Err(e) => println!("error in request {:?}", e),
105+
}
95106

96107
## How to contribute
97108
[![GitHub contributors](https://img.shields.io/github/contributors/ZigRazor/rust_ipify.svg)](https://GitHub.com/ZigRazor/rust_ipify/graphs/contributors/)

Rust_ipify_lib/src/ipify.rs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
extern crate reqwest;
22
use std::collections::HashMap;
3+
use regex::Regex;
34

45
pub fn get_ip4_json() -> Result<HashMap<String, String>, Box<dyn std::error::Error>> {
56
let body = reqwest::blocking::get("https://api.ipify.org?format=json")?
@@ -12,9 +13,9 @@ pub fn get_ip4_string() -> Result<String, Box<dyn std::error::Error>> {
1213
Ok(body)
1314
}
1415

15-
pub fn get_ip4_i64() -> Result<i64, Box<dyn std::error::Error>> {
16+
pub fn get_ip4_i32() -> Result<i32, Box<dyn std::error::Error>> {
1617
let body = reqwest::blocking::get("https://api.ipify.org")?.text()?;
17-
let result = ip_to_int(body);
18+
let result = ipv4_to_int(body);
1819
Ok(result)
1920
}
2021

@@ -29,16 +30,44 @@ pub fn get_ip_string() -> Result<String, Box<dyn std::error::Error>> {
2930
Ok(body)
3031
}
3132

32-
fn ip_to_int(ip :String) -> i64 {
33-
let mut result : i64 = 0;
33+
pub fn get_ip_i128() -> Result<i128, Box<dyn std::error::Error>> {
34+
let result : i128;
35+
let body = reqwest::blocking::get("https://api.ipify.org")?.text()?;
36+
let re = Regex::new(r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$").unwrap();
37+
if re.is_match(body.as_str()){
38+
result = ipv4_to_int(body) as i128;
39+
}else{
40+
result = ipv6_to_int(body);
41+
}
42+
Ok(result)
43+
}
44+
45+
46+
pub fn ipv4_to_int(ip :String) -> i32 {
47+
let mut result : i32 = 0;
3448
let splitted_ip : Vec<&str> = ip.split('.').collect();
3549
if splitted_ip.len() == 4 {
36-
let first_block : i64 = splitted_ip[0].parse::<i64>().unwrap();
37-
let second_block : i64 = splitted_ip[1].parse::<i64>().unwrap();
38-
let third_block : i64 = splitted_ip[2].parse::<i64>().unwrap();
39-
let fourth_block : i64 = splitted_ip[3].parse::<i64>().unwrap();
50+
let first_block : i32 = splitted_ip[0].parse::<i32>().unwrap();
51+
let second_block : i32 = splitted_ip[1].parse::<i32>().unwrap();
52+
let third_block : i32 = splitted_ip[2].parse::<i32>().unwrap();
53+
let fourth_block : i32 = splitted_ip[3].parse::<i32>().unwrap();
4054

4155
result = (first_block<<24)+(second_block<<16)+(third_block<<8)+(fourth_block<<0);
4256
}
4357
result
4458
}
59+
60+
pub fn ipv6_to_int(ip :String) -> i128 {
61+
let mut result : i128 = 0;
62+
let splitted_ip : Vec<&str> = ip.split('.').collect();
63+
64+
let i : i32 = 7;
65+
for token in splitted_ip.iter() {
66+
let token_int = i128::from_str_radix(token, 16);
67+
match token_int{
68+
Ok(o) => {result += o<<16*i;},
69+
Err(_e) => {},
70+
}
71+
}
72+
result
73+
}

Rust_ipify_lib_test/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "test_for_ipify_lib"
3-
version = "1.0.0"
3+
version = "1.1.0"
44
authors = ["ZigRazor"]
55
edition = "2018"
66
[dependencies]

Rust_ipify_lib_test/src/main.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ use rust_ipify::ipify::get_ip_json;
33
use rust_ipify::ipify::get_ip_string;
44
use rust_ipify::ipify::get_ip4_json;
55
use rust_ipify::ipify::get_ip4_string;
6-
use rust_ipify::ipify::get_ip4_i64;
6+
use rust_ipify::ipify::get_ip4_i32;
7+
use rust_ipify::ipify::get_ip_i128;
78
fn main() {
89
println!("inside main of test ");
910

@@ -33,9 +34,15 @@ fn main() {
3334
Err(e) => println!("error in request {:?}", e),
3435
}
3536

36-
let result_ip4_i64 = get_ip4_i64();
37-
match result_ip4_i64 {
38-
Ok(r) => println!("Result IP v4 ( i64 ): \n\t{:#?}\n", r),
37+
let result_ip4_i32 = get_ip4_i32();
38+
match result_ip4_i32 {
39+
Ok(r) => println!("Result IP v4 ( i32 ): \n\t{:#?}\n", r),
40+
Err(e) => println!("error in request {:?}", e),
41+
}
42+
43+
let result_ip_i128 = get_ip_i128();
44+
match result_ip_i128 {
45+
Ok(r) => println!("Result IP ( i128 ): \n\t{:#?}\n", r),
3946
Err(e) => println!("error in request {:?}", e),
4047
}
4148

0 commit comments

Comments
 (0)