krpc_core/
server.rs

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}