mmdb_client/
client.rs

1use clap::Parser;
2use grpcio::{ChannelBuilder, EnvBuilder};
3use log::{error, info};
4use mmdb_grpc::proto::geoip2::*;
5use mmdb_grpc::proto::geoip2_grpc::GeoIpClient;
6use std::sync::Arc;
7
8#[derive(Parser)]
9#[clap(version, author)]
10struct Opts {
11    #[clap(long = "ip", value_parser)]
12    ip: String,
13    #[clap(short = 'h', long = "host", value_parser, default_value = "localhost")]
14    host: String,
15    #[clap(short = 'p', long = "port", value_parser, default_value = "50000")]
16    port: u16,
17}
18
19impl Opts {
20    fn ip(&self) -> &String {
21        &self.ip
22    }
23    fn host(&self) -> &String {
24        &self.host
25    }
26}
27
28fn main() {
29    env_logger::init();
30
31    let opts: Opts = Opts::parse();
32
33    let env = Arc::new(EnvBuilder::new().build());
34    let ch = ChannelBuilder::new(env).connect(format!("{}:{}", opts.host(), opts.port).as_ref());
35    let client = GeoIpClient::new(ch);
36
37    let mut msg = Message::default();
38    msg.set_ip(opts.ip().clone());
39
40    match client.lookup(&msg) {
41        Ok(entity) => {
42            info!("requested message: {:?}, got city: {:?}", msg, entity);
43        }
44        Err(err) => {
45            error!("failed RPC, cause: {}", err);
46        }
47    }
48
49    msg.set_locales(vec![Message_Locale::ENGLISH, Message_Locale::JAPANESE]);
50
51    match client.lookup(&msg) {
52        Ok(entity) => {
53            info!("requested message: {:?}, got city: {:?}", msg, entity);
54        }
55        Err(err) => {
56            error!("failed RPC, cause: {}", err);
57        }
58    }
59
60    match client.reload(&Empty::new()) {
61        Ok(r) => info!("succeeded to reload: {:?}", r),
62        Err(err) => error!("failed RPC, cause: {}", err),
63    }
64
65    match client.metadata(&Empty::new()) {
66        Ok(r) => info!("succeeded to request metadata: {:?}", r),
67        Err(err) => error!("failed RPC, cause: {}", err),
68    }
69}