use std::sync::Arc;
use crate::core::{config::Config, supported_message::SupportedMessage};
use crate::sync::*;
use crate::types::{status_code::StatusCode, *};
use crate::server::state::ServerState;
use super::Service;
pub(crate) struct DiscoveryService;
impl Service for DiscoveryService {
fn name(&self) -> String {
String::from("DiscoveryService")
}
}
impl DiscoveryService {
pub fn new() -> DiscoveryService {
DiscoveryService {}
}
pub fn get_endpoints(
&self,
server_state: Arc<RwLock<ServerState>>,
request: &GetEndpointsRequest,
) -> SupportedMessage {
let server_state = trace_read_lock!(server_state);
let endpoints = server_state.endpoints(&request.endpoint_url, &request.profile_uris);
GetEndpointsResponse {
response_header: ResponseHeader::new_good(&request.request_header),
endpoints,
}
.into()
}
pub fn register_server(
&self,
_server_state: Arc<RwLock<ServerState>>,
request: &RegisterServerRequest,
) -> SupportedMessage {
self.service_fault(&request.request_header, StatusCode::BadNotSupported)
}
pub fn register_server2(
&self,
_server_state: Arc<RwLock<ServerState>>,
request: &RegisterServer2Request,
) -> SupportedMessage {
self.service_fault(&request.request_header, StatusCode::BadNotSupported)
}
pub fn find_servers(
&self,
server_state: Arc<RwLock<ServerState>>,
request: &FindServersRequest,
) -> SupportedMessage {
let server_state = trace_read_lock!(server_state);
let application_description = {
let config = trace_read_lock!(server_state.config);
config.application_description()
};
let mut servers = vec![application_description];
if let Some(ref server_uris) = request.server_uris {
if !server_uris.is_empty() {
servers
.retain(|server| server_uris.iter().any(|uri| *uri == server.application_uri));
}
}
let servers = Some(servers);
FindServersResponse {
response_header: ResponseHeader::new_good(&request.request_header),
servers,
}
.into()
}
}