#![allow(clippy::type_complexity, dead_code)]
use mpstthree::binary::struct_trait::{end::End, recv::Recv, send::Send};
use mpstthree::generate;
use mpstthree::role::broadcast::RoleBroadcast;
use mpstthree::role::end::RoleEnd;
use std::error::Error;
use rand::{thread_rng, Rng};
generate!(
"rec_and_cancel",
MeshedChannels,
Client,
ProxyOne,
ProxyTwo,
Server
);
struct OpenTCPConnection;
struct RequestGet {
version_protocol: i32,
header: String,
}
struct RequestPost {
version_protocol: i32,
header: String,
}
struct RequestPut {
version_protocol: i32,
header: String,
}
struct Response200 {
version_protocol: i32,
status_message: String,
header: String,
}
struct Response404 {
version_protocol: i32,
status_message: String,
header: String,
}
struct Response418 {
version_protocol: i32,
status_message: String,
header: String,
}
struct Fail;
struct Success;
struct Close;
type ClientToProxyOneTCP = Send<OpenTCPConnection, End>; type ClientToProxyTwoTCP = End; type ClientToServerTCP = Recv<OpenTCPConnectionByServerToClient, End>;
enum RequestByClientToProxyOne {
RequestGet(
MeshedChannels<
Recv<RequestGet, End>, Send<RequestGet, End>, Recv<ResponseByServerToProxyOne, End>, RoleClient<RoleProxyTwo<RoleServer<RoleEnd>>>,
NameProxyOne,
>,
),
RequestPut(
MeshedChannels<
Recv<RequestPut, End>, Send<RequestPut, End>, Recv<ResponseByServerToProxyOne, End>, RoleClient<RoleProxyTwo<RoleServer<RoleEnd>>>,
NameProxyOne,
>,
),
RequestPost(
MeshedChannels<
Recv<RequestPost, End>, Send<RequestPost, End>, Recv<ResponseByServerToProxyOne, End>, RoleClient<RoleProxyTwo<RoleServer<RoleEnd>>>,
NameProxyOne,
>,
),
Close(
MeshedChannels<
Recv<Close, End>, Send<Close, End>, End, RoleClient<RoleProxyTwo<RoleEnd>>,
NameProxyOne,
>,
),
}
enum RequestByClientToProxyTwo {
RequestGet(
MeshedChannels<
End, Recv<RequestGet, End>, Send<RequestGet, Recv<ResponseByServerToProxyTwo, End>>, RoleProxyOne<RoleServer<RoleServer<RoleEnd>>>,
NameProxyTwo,
>,
),
RequestPut(
MeshedChannels<
End, Recv<RequestPut, End>, Send<RequestPut, Recv<ResponseByServerToProxyTwo, End>>, RoleProxyOne<RoleServer<RoleServer<RoleEnd>>>,
NameProxyTwo,
>,
),
RequestPost(
MeshedChannels<
End, Recv<RequestPost, End>, Send<RequestPost, Recv<ResponseByServerToProxyTwo, End>>, RoleProxyOne<RoleServer<RoleServer<RoleEnd>>>,
NameProxyTwo,
>,
),
Close(
MeshedChannels<
End, Recv<Close, End>, Send<Close, End>, RoleProxyOne<RoleServer<RoleEnd>>,
NameProxyTwo,
>,
),
}
enum RequestByClientToServer {
RequestGet(
MeshedChannels<
Send<ResponseByServerToClient, End>, Send<ResponseByServerToProxyOne, End>, Recv<RequestGet, Send<ResponseByServerToProxyTwo, End>>, RoleProxyTwo<RoleBroadcast>,
NameServer,
>,
),
RequestPut(
MeshedChannels<
Send<ResponseByServerToClient, End>, Send<ResponseByServerToProxyOne, End>, Recv<RequestPut, Send<ResponseByServerToProxyTwo, End>>, RoleProxyTwo<RoleBroadcast>,
NameServer,
>,
),
RequestPost(
MeshedChannels<
Send<ResponseByServerToClient, End>, Send<ResponseByServerToProxyOne, End>, Recv<RequestPost, Send<ResponseByServerToProxyTwo, End>>, RoleProxyTwo<RoleBroadcast>,
NameServer,
>,
),
Close(
MeshedChannels<
End,
End,
Recv<Close, End>, RoleProxyTwo<RoleEnd>,
NameServer,
>,
),
}
type ProxyOneToClientTCP = Recv<OpenTCPConnection, End>; type ProxyOneToProxyTwoTCP = Send<OpenTCPConnection, End>; type ProxyOneToServerTCP = Recv<OpenTCPConnectionByServerToProxyOne, End>;
type ProxyTwoToClientTCP = End; type ProxyTwoToProxyOneTCP = Recv<OpenTCPConnection, End>; type ProxyTwoToServerTCP = Send<OpenTCPConnection, Recv<OpenTCPConnectionByServerToProxyTwo, End>>;
type ServerToClientTCP = Send<OpenTCPConnectionByServerToClient, End>; type ServerToProxyOneTCP = Send<OpenTCPConnectionByServerToProxyOne, End>; type ServerToProxyTwoTCP = Recv<OpenTCPConnection, Send<OpenTCPConnectionByServerToProxyTwo, End>>;
enum OpenTCPConnectionByServerToClient {
Fail(
MeshedChannels<
Recv<Fail, End>, End, End, RoleProxyOne<RoleEnd>,
NameClient,
>,
),
Success(
MeshedChannels<
Recv<Success, Send<RequestByClientToProxyOne, End>>, Send<RequestByClientToProxyTwo, End>, Send<RequestByClientToServer, End>, RoleProxyOne<RoleBroadcast>,
NameClient,
>,
),
}
enum OpenTCPConnectionByServerToProxyOne {
Fail(
MeshedChannels<
Send<Fail, End>, Recv<Fail, End>, End, RoleProxyTwo<RoleClient<RoleEnd>>,
NameProxyOne,
>,
),
Success(
MeshedChannels<
Send<Success, Recv<RequestByClientToProxyOne, End>>, Recv<Success, End>, End, RoleProxyTwo<RoleClient<RoleClient<RoleEnd>>>,
NameProxyOne,
>,
),
}
enum OpenTCPConnectionByServerToProxyTwo {
Fail(
MeshedChannels<
End, Send<Fail, End>, Recv<Fail, End>, RoleServer<RoleProxyOne<RoleEnd>>,
NameProxyTwo,
>,
),
Success(
MeshedChannels<
Recv<RequestByClientToProxyTwo, End>, Send<Success, End>, Recv<Success, End>, RoleServer<RoleProxyOne<RoleClient<RoleEnd>>>,
NameProxyTwo,
>,
),
}
enum ResponseByServerToClient {
Response200(
MeshedChannels<
Recv<Response200, Send<RequestByClientToProxyOne, End>>, Send<RequestByClientToProxyTwo, End>, Send<RequestByClientToServer, End>, RoleProxyOne<RoleBroadcast>,
NameClient,
>,
),
Response404(
MeshedChannels<
Recv<Response404, Send<RequestByClientToProxyOne, End>>, Send<RequestByClientToProxyTwo, End>, Send<RequestByClientToServer, End>, RoleProxyOne<RoleBroadcast>,
NameClient,
>,
),
Response418(
MeshedChannels<
Recv<Response418, Send<RequestByClientToProxyOne, End>>, Send<RequestByClientToProxyTwo, End>, Send<RequestByClientToServer, End>, RoleProxyOne<RoleBroadcast>,
NameClient,
>,
),
}
enum ResponseByServerToProxyOne {
Response200(
MeshedChannels<
Send<Response200, Recv<RequestByClientToProxyOne, End>>, Recv<Response200, End>, End, RoleProxyTwo<RoleClient<RoleClient<RoleEnd>>>,
NameProxyOne,
>,
),
Response404(
MeshedChannels<
Send<Response404, Recv<RequestByClientToProxyOne, End>>, Recv<Response404, End>, End, RoleProxyTwo<RoleClient<RoleClient<RoleEnd>>>,
NameProxyOne,
>,
),
Response418(
MeshedChannels<
Send<Response418, Recv<RequestByClientToProxyOne, End>>, Recv<Response418, End>, End, RoleProxyTwo<RoleClient<RoleClient<RoleEnd>>>,
NameProxyOne,
>,
),
}
enum ResponseByServerToProxyTwo {
Response200(
MeshedChannels<
Recv<RequestByClientToProxyTwo, End>, Send<Response200, End>, Recv<Response200, End>, RoleServer<RoleProxyOne<RoleClient<RoleEnd>>>,
NameProxyTwo,
>,
),
Response404(
MeshedChannels<
Recv<RequestByClientToProxyTwo, End>, Send<Response404, End>, Recv<Response404, End>, RoleServer<RoleProxyOne<RoleClient<RoleEnd>>>,
NameProxyTwo,
>,
),
Response418(
MeshedChannels<
Recv<RequestByClientToProxyTwo, End>, Send<Response418, End>, Recv<Response418, End>, RoleServer<RoleProxyOne<RoleClient<RoleEnd>>>,
NameProxyTwo,
>,
),
}
type OrderingClient = RoleProxyOne<RoleServer<RoleEnd>>;
type OrderingProxyOne = RoleClient<RoleProxyTwo<RoleServer<RoleEnd>>>;
type OrderingProxyTwo = RoleProxyOne<RoleServer<RoleServer<RoleEnd>>>;
type OrderingServer = RoleProxyTwo<RoleBroadcast>;
type EndpointClient = MeshedChannels<
ClientToProxyOneTCP,
ClientToProxyTwoTCP,
ClientToServerTCP,
OrderingClient,
NameClient,
>;
type RecursClient = MeshedChannels<
Send<RequestByClientToProxyOne, End>,
Send<RequestByClientToProxyTwo, End>,
Send<RequestByClientToServer, End>,
RoleBroadcast,
NameClient,
>;
type EndpointClientClose =
MeshedChannels<Send<Close, End>, End, End, RoleProxyOne<RoleEnd>, NameClient>;
type EndpointClientRequestGet = MeshedChannels<
Send<RequestGet, End>,
End,
Recv<ResponseByServerToClient, End>,
RoleProxyOne<RoleServer<RoleEnd>>,
NameClient,
>;
type EndpointClientRequestPut = MeshedChannels<
Send<RequestPut, End>,
End,
Recv<ResponseByServerToClient, End>,
RoleProxyOne<RoleServer<RoleEnd>>,
NameClient,
>;
type EndpointClientRequestPost = MeshedChannels<
Send<RequestPost, End>,
End,
Recv<ResponseByServerToClient, End>,
RoleProxyOne<RoleServer<RoleEnd>>,
NameClient,
>;
type EndpointProxyOne = MeshedChannels<
ProxyOneToClientTCP,
ProxyOneToProxyTwoTCP,
ProxyOneToServerTCP,
OrderingProxyOne,
NameProxyOne,
>;
type RecursProxyOne = MeshedChannels<
Recv<RequestByClientToProxyOne, End>,
End,
End,
RoleClient<RoleEnd>,
NameProxyOne,
>;
type EndpointProxyTwo = MeshedChannels<
ProxyTwoToClientTCP,
ProxyTwoToProxyOneTCP,
ProxyTwoToServerTCP,
OrderingProxyTwo,
NameProxyTwo,
>;
type RecursProxyTwo = MeshedChannels<
Recv<RequestByClientToProxyTwo, End>,
End,
End,
RoleClient<RoleEnd>,
NameProxyTwo,
>;
type EndpointServer = MeshedChannels<
ServerToClientTCP,
ServerToProxyOneTCP,
ServerToProxyTwoTCP,
OrderingServer,
NameServer,
>;
type EndpointServerFail =
MeshedChannels<End, End, Send<Fail, End>, RoleProxyTwo<RoleEnd>, NameServer>;
type EndpointServerSuccess = MeshedChannels<
Recv<RequestByClientToServer, End>,
End,
Send<Success, End>,
RoleProxyTwo<RoleClient<RoleEnd>>,
NameServer,
>;
type RecursServer =
MeshedChannels<Recv<RequestByClientToServer, End>, End, End, RoleClient<RoleEnd>, NameServer>;
type EndpointServerResponse200 = MeshedChannels<
Recv<RequestByClientToServer, End>,
End,
Send<Response200, End>,
RoleProxyTwo<RoleClient<RoleEnd>>,
NameServer,
>;
type EndpointServerResponse404 = MeshedChannels<
Recv<RequestByClientToServer, End>,
End,
Send<Response404, End>,
RoleProxyTwo<RoleClient<RoleEnd>>,
NameServer,
>;
type EndpointServerResponse418 = MeshedChannels<
Recv<RequestByClientToServer, End>,
End,
Send<Response418, End>,
RoleProxyTwo<RoleClient<RoleEnd>>,
NameServer,
>;
fn endpoint_client(s: EndpointClient) -> Result<(), Box<dyn Error>> {
let s = s.send(OpenTCPConnection {})?;
offer_mpst!(s, {
OpenTCPConnectionByServerToClient::Fail(s) => {
let (_, s) = s.recv()?;
s.close()
},
OpenTCPConnectionByServerToClient::Success(s) => {
let (_, s) = s.recv()?;
recurs_client(s, 100)
},
})
}
fn recurs_client(s: RecursClient, loops: i32) -> Result<(), Box<dyn Error>> {
if loops == 0 {
let s: EndpointClientClose = choose_mpst_client_to_all!(
s,
RequestByClientToProxyOne::Close,
RequestByClientToProxyTwo::Close,
RequestByClientToServer::Close
);
let s = s.send(Close {})?;
s.close()
} else {
match thread_rng().gen_range(1..3) {
1 => {
let s: EndpointClientRequestGet = choose_mpst_client_to_all!(
s,
RequestByClientToProxyOne::RequestGet,
RequestByClientToProxyTwo::RequestGet,
RequestByClientToServer::RequestGet
);
let s = s.send(RequestGet {
version_protocol: 5,
header: String::from("GET"),
})?;
offer_mpst!(s, {
ResponseByServerToClient::Response200(s) => {
let (_, s) = s.recv()?;
recurs_client(s, loops -1)
},
ResponseByServerToClient::Response404(s) => {
let (_, s) = s.recv()?;
recurs_client(s, loops -1)
},
ResponseByServerToClient::Response418(s) => {
let (_, s) = s.recv()?;
recurs_client(s, loops -1)
},
})
}
2 => {
let s: EndpointClientRequestPut = choose_mpst_client_to_all!(
s,
RequestByClientToProxyOne::RequestPut,
RequestByClientToProxyTwo::RequestPut,
RequestByClientToServer::RequestPut
);
let s = s.send(RequestPut {
version_protocol: 5,
header: String::from("PUT"),
})?;
offer_mpst!(s, {
ResponseByServerToClient::Response200(s) => {
let (_, s) = s.recv()?;
recurs_client(s, loops -1)
},
ResponseByServerToClient::Response404(s) => {
let (_, s) = s.recv()?;
recurs_client(s, loops -1)
},
ResponseByServerToClient::Response418(s) => {
let (_, s) = s.recv()?;
recurs_client(s, loops -1)
},
})
}
3 => {
let s: EndpointClientRequestPost = choose_mpst_client_to_all!(
s,
RequestByClientToProxyOne::RequestPost,
RequestByClientToProxyTwo::RequestPost,
RequestByClientToServer::RequestPost
);
let s = s.send(RequestPost {
version_protocol: 5,
header: String::from("POST"),
})?;
offer_mpst!(s, {
ResponseByServerToClient::Response200(s) => {
let (_, s) = s.recv()?;
recurs_client(s, loops -1)
},
ResponseByServerToClient::Response404(s) => {
let (_, s) = s.recv()?;
recurs_client(s, loops -1)
},
ResponseByServerToClient::Response418(s) => {
let (_, s) = s.recv()?;
recurs_client(s, loops -1)
},
})
}
_ => panic!("Error, unexpected input"),
}
}
}
fn endpoint_proxyone(s: EndpointProxyOne) -> Result<(), Box<dyn Error>> {
let (opentcpconnection, s) = s.recv()?;
let s = s.send(opentcpconnection)?;
offer_mpst!(s, {
OpenTCPConnectionByServerToProxyOne::Fail(s) => {
let (fail, s) = s.recv()?;
let s = s.send(fail)?;
s.close()
},
OpenTCPConnectionByServerToProxyOne::Success(s) => {
let (fail, s) = s.recv()?;
let s = s.send(fail)?;
recurs_proxyone(s)
},
})
}
fn recurs_proxyone(s: RecursProxyOne) -> Result<(), Box<dyn Error>> {
offer_mpst!(s, {
RequestByClientToProxyOne::RequestGet(s) => {
let (request, s) = s.recv()?;
let s = s.send(request)?;
offer_mpst!(s, {
ResponseByServerToProxyOne::Response200(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxyone(s)
},
ResponseByServerToProxyOne::Response404(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxyone(s)
},
ResponseByServerToProxyOne::Response418(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxyone(s)
},
})
},
RequestByClientToProxyOne::RequestPut(s) => {
let (request, s) = s.recv()?;
let s = s.send(request)?;
offer_mpst!(s, {
ResponseByServerToProxyOne::Response200(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxyone(s)
},
ResponseByServerToProxyOne::Response404(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxyone(s)
},
ResponseByServerToProxyOne::Response418(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxyone(s)
},
})
},
RequestByClientToProxyOne::RequestPost(s) => {
let (request, s) = s.recv()?;
let s = s.send(request)?;
offer_mpst!(s, {
ResponseByServerToProxyOne::Response200(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxyone(s)
},
ResponseByServerToProxyOne::Response404(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxyone(s)
},
ResponseByServerToProxyOne::Response418(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxyone(s)
},
})
},
RequestByClientToProxyOne::Close(s) => {
let (request, s) = s.recv()?;
let s = s.send(request)?;
s.close()
},
})
}
fn endpoint_proxytwo(s: EndpointProxyTwo) -> Result<(), Box<dyn Error>> {
let (opentcpconnection, s) = s.recv()?;
let s = s.send(opentcpconnection)?;
offer_mpst!(s, {
OpenTCPConnectionByServerToProxyTwo::Fail(s) => {
let (fail, s) = s.recv()?;
let s = s.send(fail)?;
s.close()
},
OpenTCPConnectionByServerToProxyTwo::Success(s) => {
let (fail, s) = s.recv()?;
let s = s.send(fail)?;
recurs_proxytwo(s)
},
})
}
fn recurs_proxytwo(s: RecursProxyTwo) -> Result<(), Box<dyn Error>> {
offer_mpst!(s, {
RequestByClientToProxyTwo::RequestGet(s) => {
let (request, s) = s.recv()?;
let s = s.send(request)?;
offer_mpst!(s, {
ResponseByServerToProxyTwo::Response200(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxytwo(s)
},
ResponseByServerToProxyTwo::Response404(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxytwo(s)
},
ResponseByServerToProxyTwo::Response418(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxytwo(s)
},
})
},
RequestByClientToProxyTwo::RequestPut(s) => {
let (request, s) = s.recv()?;
let s = s.send(request)?;
offer_mpst!(s, {
ResponseByServerToProxyTwo::Response200(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxytwo(s)
},
ResponseByServerToProxyTwo::Response404(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxytwo(s)
},
ResponseByServerToProxyTwo::Response418(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxytwo(s)
},
})
},
RequestByClientToProxyTwo::RequestPost(s) => {
let (request, s) = s.recv()?;
let s = s.send(request)?;
offer_mpst!(s, {
ResponseByServerToProxyTwo::Response200(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxytwo(s)
},
ResponseByServerToProxyTwo::Response404(s) => {
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxytwo(s)
},
ResponseByServerToProxyTwo::Response418(s) => {
println!("ProxyTwo Request GET");
let (response, s) = s.recv()?;
let s = s.send(response)?;
recurs_proxytwo(s)
},
})
},
RequestByClientToProxyTwo::Close(s) => {
let (request, s) = s.recv()?;
let s = s.send(request)?;
s.close()
},
})
}
fn endpoint_server(s: EndpointServer) -> Result<(), Box<dyn Error>> {
let (_, s) = s.recv()?;
match thread_rng().gen_range(1..10) {
1 => {
let s: EndpointServerFail = choose_mpst_server_to_all!(
s,
OpenTCPConnectionByServerToClient::Fail,
OpenTCPConnectionByServerToProxyOne::Fail,
OpenTCPConnectionByServerToProxyTwo::Fail
);
let s = s.send(Fail {})?;
s.close()
}
_ => {
let s: EndpointServerSuccess = choose_mpst_server_to_all!(
s,
OpenTCPConnectionByServerToClient::Success,
OpenTCPConnectionByServerToProxyOne::Success,
OpenTCPConnectionByServerToProxyTwo::Success
);
let s = s.send(Success {})?;
recurs_server(s)
}
}
}
fn recurs_server(s: RecursServer) -> Result<(), Box<dyn Error>> {
offer_mpst!(s, {
RequestByClientToServer::RequestGet(s) => {
let (_, s) = s.recv()?;
match thread_rng().gen_range(1..3) {
1 => {
let s: EndpointServerResponse200 = choose_mpst_server_to_all!(
s,
ResponseByServerToClient::Response200,
ResponseByServerToProxyOne::Response200,
ResponseByServerToProxyTwo::Response200
);
let s = s.send(Response200 {
version_protocol: 5,
status_message: String::from("OK"),
header: String::from("200")
})?;
recurs_server(s)
}
2 => {
let s: EndpointServerResponse404 = choose_mpst_server_to_all!(
s,
ResponseByServerToClient::Response404,
ResponseByServerToProxyOne::Response404,
ResponseByServerToProxyTwo::Response404
);
let s = s.send(Response404 {
version_protocol: 5,
status_message: String::from("Resource not found"),
header: String::from("404")
})?;
recurs_server(s)
}
3 => {
let s: EndpointServerResponse418 = choose_mpst_server_to_all!(
s,
ResponseByServerToClient::Response418,
ResponseByServerToProxyOne::Response418,
ResponseByServerToProxyTwo::Response418
);
let s = s.send(Response418 {
version_protocol: 5,
status_message: String::from("I'm a tea pot"),
header: String::from("418")
})?;
recurs_server(s)
}
_ => panic!("Error, unexpected number")
}
},
RequestByClientToServer::RequestPut(s) => {
let (_, s) = s.recv()?;
match thread_rng().gen_range(1..3) {
1 => {
let s: EndpointServerResponse200 = choose_mpst_server_to_all!(
s,
ResponseByServerToClient::Response200,
ResponseByServerToProxyOne::Response200,
ResponseByServerToProxyTwo::Response200
);
let s = s.send(Response200 {
version_protocol: 5,
status_message: String::from("OK"),
header: String::from("200")
})?;
recurs_server(s)
}
2 => {
let s: EndpointServerResponse404 = choose_mpst_server_to_all!(
s,
ResponseByServerToClient::Response404,
ResponseByServerToProxyOne::Response404,
ResponseByServerToProxyTwo::Response404
);
let s = s.send(Response404 {
version_protocol: 5,
status_message: String::from("Resource not found"),
header: String::from("404")
})?;
recurs_server(s)
}
3 => {
let s: EndpointServerResponse418 = choose_mpst_server_to_all!(
s,
ResponseByServerToClient::Response418,
ResponseByServerToProxyOne::Response418,
ResponseByServerToProxyTwo::Response418
);
let s = s.send(Response418 {
version_protocol: 5,
status_message: String::from("I'm a tea pot"),
header: String::from("418")
})?;
recurs_server(s)
}
_ => panic!("Error, unexpected number")
}
},
RequestByClientToServer::RequestPost(s) => {
let (_, s) = s.recv()?;
match thread_rng().gen_range(1..3) {
1 => {
let s: EndpointServerResponse200 = choose_mpst_server_to_all!(
s,
ResponseByServerToClient::Response200,
ResponseByServerToProxyOne::Response200,
ResponseByServerToProxyTwo::Response200
);
let s = s.send(Response200 {
version_protocol: 5,
status_message: String::from("OK"),
header: String::from("200")
})?;
recurs_server(s)
}
2 => {
let s: EndpointServerResponse404 = choose_mpst_server_to_all!(
s,
ResponseByServerToClient::Response404,
ResponseByServerToProxyOne::Response404,
ResponseByServerToProxyTwo::Response404
);
let s = s.send(Response404 {
version_protocol: 5,
status_message: String::from("Resource not found"),
header: String::from("404")
})?;
recurs_server(s)
}
3 => {
let s: EndpointServerResponse418 = choose_mpst_server_to_all!(
s,
ResponseByServerToClient::Response418,
ResponseByServerToProxyOne::Response418,
ResponseByServerToProxyTwo::Response418
);
let s = s.send(Response418 {
version_protocol: 5,
status_message: String::from("I'm a tea pot"),
header: String::from("418")
})?;
recurs_server(s)
}
_ => panic!("Error, unexpected number")
}
},
RequestByClientToServer::Close(s) => {
let (_, s) = s.recv()?;
s.close()
},
})
}
fn main() {
let (thread_client, thread_proxyone, thread_proxytwo, thread_server) = fork_mpst(
endpoint_client,
endpoint_proxyone,
endpoint_proxytwo,
endpoint_server,
);
thread_client.join().unwrap();
thread_proxyone.join().unwrap();
thread_proxytwo.join().unwrap();
thread_server.join().unwrap();
}