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
87
88
89
90
91
92
93
94
95
96
97
98
99
use super::backend_handler::BackEndHandler;
use crate::authenticators::ApplicationName;
use log::trace;
use parsec_interface::requests::request::Request;
use parsec_interface::requests::ProviderID;
use parsec_interface::requests::{Response, ResponseStatus};
use std::collections::HashMap;
use std::io::{Error, ErrorKind, Result};
#[derive(Debug)]
pub struct Dispatcher {
backends: HashMap<ProviderID, BackEndHandler>,
}
impl Dispatcher {
pub fn dispatch_request(
&self,
request: Request,
app_name: Option<ApplicationName>,
) -> Response {
trace!("dispatch_request ingress");
if let Some(backend) = self.backends.get(&request.header.provider) {
if let Err(status) = backend.is_capable(&request) {
Response::from_request_header(request.header, status)
} else {
{
let response = backend.execute_request(request, app_name);
trace!("execute_request egress");
response
}
}
} else {
Response::from_request_header(request.header, ResponseStatus::ProviderNotRegistered)
}
}
}
#[derive(Debug, Default)]
pub struct DispatcherBuilder {
backends: Option<HashMap<ProviderID, BackEndHandler>>,
}
impl DispatcherBuilder {
pub fn new() -> Self {
DispatcherBuilder { backends: None }
}
pub fn with_backend(
mut self,
provider_id: ProviderID,
backend_handler: BackEndHandler,
) -> Self {
let mut backends = self.backends.unwrap_or_default();
let _ = backends.insert(provider_id, backend_handler);
self.backends = Some(backends);
self
}
pub fn with_backends(mut self, new_backends: HashMap<ProviderID, BackEndHandler>) -> Self {
let mut backends = self.backends.unwrap_or_default();
backends.extend(new_backends);
self.backends = Some(backends);
self
}
pub fn build(self) -> Result<Dispatcher> {
Ok(Dispatcher {
backends: self
.backends
.ok_or_else(|| Error::new(ErrorKind::InvalidData, "backends is missing"))?,
})
}
}