#!/usr/bin/env runrs //! ```cargo //! [dependencies] //! serde = { version = "1.0", features = ["derive"] } //! serde_json = "1.0" //! reqwest = { version = "0.11", features = ["blocking", "json"] } //! rust_util = { version = "0.6" } //! ``` use rust_util::{failure_and_exit, success}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] struct IpResponse { status: u16, message: String, ip: String, #[serde(rename = "userAgent")] user_agent: Option, } const GET_IP_URL: &'static str = "https://hatter.ink/ip/ip.jsonp"; fn main() { let ip_response: IpResponse = reqwest::blocking::get(GET_IP_URL).unwrap_or_else(|e| { failure_and_exit!("Send request to: {} failed: {}", GET_IP_URL, e); }).json().unwrap_or_else(|e| { failure_and_exit!("Parse response from: {}, failed: {}", GET_IP_URL, e); }); success!("Your IP address is: {}", ip_response.ip); }