extern crate wifiscanner;
extern crate curl;
extern crate serde;
extern crate serde_json;
use serde_json::Value;
use wifiscanner::Wifi;
use curl::easy::{Easy, List};
#[doc(hidden)]
const BASE_URL: &'static str = "https://maps.googleapis.com/maps/api/browserlocation/json";
#[doc(hidden)]
const BASE_PARAMS: &'static str = "?browser=firefox&sensor=true";
#[derive(Debug)]
pub struct GpsLocation {
pub accuracy: String,
pub location: Location,
}
#[derive(Debug)]
pub struct Location {
pub lng: String,
pub lat: String,
}
pub fn get_towers() -> Vec<Wifi> {
wifiscanner::scan().unwrap() }
pub fn get_location(towers: Vec<Wifi>) -> Result<GpsLocation, String> {
let mut handle = Easy::new();
let mut url = String::new();
url.push_str(BASE_URL);
url.push_str(BASE_PARAMS);
let mut url_params = String::new();
for tower in towers {
url_params.push_str(&format!("&wifi=mac:{}&7Cssid:{}&7Css:{}",
tower.mac,
tower.ssid,
tower.signal_level)
.to_string());
}
let encoded_params = handle.url_encode(url_params.as_bytes());
url.push_str(&encoded_params);
let mut list = List::new();
list.append("Accept: application/json").unwrap();
handle.post(true).unwrap();
handle.post_field_size(0).unwrap();
handle.http_headers(list).unwrap();
let mut data = Vec::new();
handle.url(&url.to_string()).unwrap();
{
let mut transfer = handle.transfer();
transfer.write_function(|new_data| {
data.extend_from_slice(new_data);
Ok(new_data.len())
})
.unwrap();
transfer.perform().unwrap();
}
let data_string = String::from_utf8(data.clone());
let raw_json = data_string.unwrap().to_string();
let raw: Value = serde_json::from_str(&raw_json).unwrap();
let json_obj = raw.as_object().unwrap();
let accuracy = json_obj.get("accuracy").unwrap();
let location = json_obj.get("location").unwrap().as_object().unwrap();
let lat = location.get("lat").unwrap();
let lng = location.get("lng").unwrap();
Ok(GpsLocation {
accuracy: accuracy.to_string(),
location: Location {
lng: lng.to_string(),
lat: lat.to_string(),
},
})
}