parsec_service/back/
dispatcher.rs1use super::backend_handler::BackEndHandler;
8use crate::authenticators::Application;
9use log::trace;
10use parsec_interface::requests::request::Request;
11use parsec_interface::requests::ProviderId;
12use parsec_interface::requests::{Response, ResponseStatus};
13use std::collections::HashMap;
14use std::io::{Error, ErrorKind, Result};
15
16#[derive(Debug)]
24pub struct Dispatcher {
25 backends: HashMap<ProviderId, BackEndHandler>,
26}
27
28impl Dispatcher {
29 pub fn dispatch_request(&self, request: Request, app: Option<Application>) -> Response {
36 trace!("dispatch_request ingress");
37 if let Some(backend) = self.backends.get(&request.header.provider) {
38 if let Err(status) = backend.is_capable(&request) {
39 Response::from_request_header(request.header, status)
40 } else {
41 {
42 let response = backend.execute_request(request, app);
43 trace!("execute_request egress");
44 response
45 }
46 }
47 } else {
48 Response::from_request_header(request.header, ResponseStatus::ProviderNotRegistered)
49 }
50 }
51}
52
53#[derive(Debug, Default)]
55pub struct DispatcherBuilder {
56 backends: Option<HashMap<ProviderId, BackEndHandler>>,
57}
58
59impl DispatcherBuilder {
60 pub fn new() -> Self {
62 DispatcherBuilder { backends: None }
63 }
64
65 pub fn with_backend(
67 mut self,
68 provider_id: ProviderId,
69 backend_handler: BackEndHandler,
70 ) -> Self {
71 let mut backends = self.backends.unwrap_or_default();
72 let _ = backends.insert(provider_id, backend_handler);
73 self.backends = Some(backends);
74
75 self
76 }
77
78 pub fn with_backends(mut self, new_backends: HashMap<ProviderId, BackEndHandler>) -> Self {
80 let mut backends = self.backends.unwrap_or_default();
81 backends.extend(new_backends);
82 self.backends = Some(backends);
83
84 self
85 }
86
87 pub fn build(self) -> Result<Dispatcher> {
89 Ok(Dispatcher {
90 backends: self
91 .backends
92 .ok_or_else(|| Error::new(ErrorKind::InvalidData, "backends is missing"))?,
93 })
94 }
95}