route_service/
route_service.rs

1
2use dotenvy::dotenv;
3use google_api_rust_client_unoffical::{auth::service_account::ServiceAccountCredentials, services::route_service::{common_models::{Location, RouteTravelMode, RoutingPreference, TransitPreferences, TransitTravelMode, WayPoint}, get_route_matrix::request_model::RouteMatrixOrigin, RouteService}};
4// use google_api_rust_client_unoffical::services::route_service::{get_route::{common_models::{Location, WayPoint, RouteTravelMode}, request_model::{RoutingPreference, TransitPreferences, TransitTravelMode, }, GetRouteResponseFieldMask}, RouteService};
5use serde_json::Value;
6use std::{collections::HashMap, env, path::PathBuf, str::FromStr};
7use anyhow::Result;
8
9#[tokio::main]
10async fn main() -> Result<()> {
11    dotenv().ok();
12
13    // get route
14    get_route().await?;
15
16    // get route matrix
17    get_route_matrix().await?;
18
19    Ok(())
20}
21
22
23async fn get_route() -> Result<()> {
24    dotenv().ok();
25
26    // api auth
27    let api_key = env::var("API_KEY")?;
28    let mut route_service = RouteService::new_with_api_key(api_key);
29
30    let masks = vec!["routes.duration", "routes.distanceMeters"];
31    let origin = WayPoint::new_from_location(Location::new(37.419734, -122.0827784, None), None)?;
32    let destination = WayPoint::new_from_location(Location::new(35.419734, -100.0827784, None), None)?;
33
34    let mut mid_waypoint_option: HashMap<String, Value> = HashMap::new();
35    mid_waypoint_option.insert("via".to_string(), true.into());
36
37    let mut route_option: HashMap<String, Value> = HashMap::new();
38    // let mid_waypoint = WayPoint::new_from_place_id("ChIJgUbEo8cfqokR5lP9_Wh_DaM", Some(mid_waypoint_option))?;
39    // route_option.insert("intermediates".to_owned(), serde_json::to_value(vec![mid_waypoint.clone()])?);
40    route_option.insert("travelMode".to_owned(), serde_json::to_value(RouteTravelMode::Drive)?);
41    route_option.insert("routingPreference".to_owned(), serde_json::to_value(RoutingPreference::TrafficAwareOptimal)?);
42    // route_option.insert("departureTime".to_owned(), serde_json::to_value(Utc::now() + Duration::seconds(60 * 60 * 24))?);
43    // let route_modifiers = RouteModifiers::new(Some(true), Some(true), Some(true), None, None, None);
44    // route_option.insert("routeModifiers".to_owned(), serde_json::to_value(route_modifiers)?);
45    // route_option.insert("requestedReferenceRoutes".to_owned(), serde_json::to_value(vec![ReferenceRoute::FuelEfficient])?);
46    let transit_preference = TransitPreferences::new(Some(vec![TransitTravelMode::Bus]), None);
47    route_option.insert("transitPreferences".to_owned(), serde_json::to_value(transit_preference)?);
48
49    let response = route_service.get_route(&origin, &destination, Some(masks.clone()), Some(route_option.clone())).await?;
50    println!("response: {}", serde_json::to_string_pretty(&response)?);
51
52
53    // service account auth
54    let filepath: PathBuf = PathBuf::from_str("credentials.json")?;
55    let credentials = ServiceAccountCredentials::from_service_account_file(filepath)?;
56    let mut route_service = RouteService::new_with_credentials(credentials);
57    let response = route_service.get_route(&origin, &destination, Some(masks.clone()), Some(route_option.clone())).await?;
58    println!("response: {}", serde_json::to_string(&response)?);
59
60    Ok(())
61}
62
63
64async fn get_route_matrix() -> Result<()> {
65    dotenv().ok();
66
67    // api auth
68    let api_key = env::var("API_KEY")?;
69    let mut route_service = RouteService::new_with_api_key(api_key);
70
71    let masks = vec!["originIndex", "destinationIndex", "status", "condition", "distanceMeters", "duration"];
72    let origin = WayPoint::new_from_location(Location::new(37.419734, -122.0827784, None), None)?;
73    let destination = WayPoint::new_from_location(Location::new(35.419734, -100.0827784, None), None)?;
74
75    let mut route_option: HashMap<String, Value> = HashMap::new();
76    // let mid_waypoint = WayPoint::new_from_place_id("ChIJgUbEo8cfqokR5lP9_Wh_DaM", Some(mid_waypoint_option))?;
77    // route_option.insert("intermediates".to_owned(), serde_json::to_value(vec![mid_waypoint.clone()])?);
78    route_option.insert("travelMode".to_owned(), serde_json::to_value(RouteTravelMode::Drive)?);
79
80    let response = route_service.get_route_matrix(&vec![RouteMatrixOrigin::new(&origin)], &vec![RouteMatrixOrigin::new(&destination)], Some(masks.clone()), Some(route_option.clone())).await?;
81    println!("response: {}", serde_json::to_string_pretty(&response)?);
82
83
84    // service account auth
85    let filepath: PathBuf = PathBuf::from_str("credentials.json")?;
86    let credentials = ServiceAccountCredentials::from_service_account_file(filepath)?;
87    let mut route_service = RouteService::new_with_credentials(credentials);
88    let response = route_service.get_route_matrix(&vec![RouteMatrixOrigin::new(&origin)], &vec![RouteMatrixOrigin::new(&destination)], Some(masks.clone()), Some(route_option.clone())).await?;
89    println!("response: {}", serde_json::to_string_pretty(&response)?);
90
91    Ok(())
92}