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}