1use crate::{
2 protocol::server::TcpServer,
3 register::{Info, Register, RegisterBuilder, Resource},
4};
5use krpc_common::RpcServer;
6use std::{collections::HashMap, sync::Arc};
7use tokio::sync::RwLock;
8
9pub struct KrpcServer {
10 port: String,
11 rpc_servers: HashMap<String, Arc<Box<dyn RpcServer>>>,
12 register: Box<dyn Register>,
13}
14
15impl KrpcServer {
16 pub fn build(register_builder: RegisterBuilder, port: &str) -> KrpcServer {
17 let map = Arc::new(RwLock::new(HashMap::new()));
18 return KrpcServer {
19 port: port.to_string(),
20 register: register_builder.init(map),
21 rpc_servers: HashMap::new(),
22 };
23 }
24
25 pub fn add_rpc_server(mut self, server: Box<dyn RpcServer>) -> KrpcServer {
26 let info = server.get_info();
27 let server_name = info.0.to_string() + "." + &info.1.to_string();
28 let mut key = server_name.clone();
29 if let Some(version) = info.2 {
30 key.push_str(":");
31 key.push_str(version);
32 }
33 self.register.add_resource(Resource::Server(Info {
34 server_name,
35 version: info.2.map(|e| e.to_string()),
36 methods: info.3,
37 ip: krpc_common::get_ip(),
38 port: Some(self.port.clone()),
39 }));
40 self.rpc_servers.insert(key, Arc::new(server));
41 return self;
42 }
43
44 pub async fn run(&mut self) {
45 let port = self.port.clone();
46 let tcp_server = TcpServer::init(&port[..], self.rpc_servers.clone());
47 let _ = tcp_server.run().await;
48 }
49}