1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
use std::collections::HashMap; use crate::{errors::ProtocolError, protocol::{Encapsulation, EndPointType, Identity, LocatorResult, RequestData}, proxy_parser::{DirectProxyData, IndirectProxyData}}; use crate::encoding::{ToBytes,FromBytes}; use crate::proxy::Proxy; pub struct Locator { proxy: Proxy, request_id: i32 } impl Locator { pub fn from(proxy: Proxy) -> Locator { Locator { proxy: proxy, request_id: 0 } } pub async fn locate(&mut self, proxy_data: IndirectProxyData) -> Result<DirectProxyData, Box<dyn std::error::Error + Sync + Send>> { match proxy_data.adapter { Some(adapter) => { let result = self.find_adapter_by_id(&adapter).await?; Ok(DirectProxyData { ident: result.proxy_data.id, endpoint: result.endpoint }) } None => { let obj_result = self.find_object_by_id(&proxy_data.ident).await?; match obj_result.endpoint { EndPointType::WellKnownObject(object) => { let adapter_result = self.find_adapter_by_id(&object).await?; Ok(DirectProxyData { ident: obj_result.proxy_data.id, endpoint: adapter_result.endpoint }) } _ => Ok(DirectProxyData { ident: obj_result.proxy_data.id, endpoint: obj_result.endpoint }) } } } } pub async fn find_object_by_id(&mut self, req: &str) -> Result<LocatorResult, Box<dyn std::error::Error + Sync + Send>> { self.request_id = self.request_id + 1; let mut bytes = req.to_bytes()?; bytes.push(0); let req_data = RequestData { request_id: self.request_id, id: Identity::new(&self.proxy.ident), facet: vec![], operation: String::from("findObjectById"), mode: 1, context: HashMap::new(), params: Encapsulation::from(bytes) }; let reply = self.proxy.make_request::<ProtocolError>(&req_data).await?; let mut read = 0; LocatorResult::from_bytes(&reply.body.data[read as usize..reply.body.data.len()], &mut read) } pub async fn find_adapter_by_id(&mut self, req: &str) -> Result<LocatorResult, Box<dyn std::error::Error + Sync + Send>> { self.request_id = self.request_id + 1; let bytes = req.to_bytes()?; let req_data = RequestData { request_id: self.request_id, id: Identity::new(&self.proxy.ident), facet: vec![], operation: String::from("findAdapterById"), mode: 1, context: HashMap::new(), params: Encapsulation::from(bytes) }; let reply = self.proxy.make_request::<ProtocolError>(&req_data).await?; let mut read = 0; LocatorResult::from_bytes(&reply.body.data[read as usize..reply.body.data.len()], &mut read) } }