Message Passing
Request/Response Pair
Correlate by Id
Request and response messages often carry an id so a receiver can connect the reply to the original request.
Program
Play the program to choose a request id and build the matching response.
request_response_pair.rs
Replay: real traced execution (multi-file project)
fn main() {
let request_id = 7;
let request = Request { id: request_id, body: "status" };
let response = respond(request);
println!("{}:{}", response.id, response.body);
}
struct Request {
id: i32,
body: &'static str,
}
struct Response {
id: i32,
body: String,
}
fn respond(request: Request) -> Response {
let body = format!("ok:{}", request.body);
Response { id: request.id, body }
}
fn main() {
let request_id = 1;
let request = Request { id: request_id, body: "status" };
let response = respond(request);
println!("{}:{}", response.id, response.body);
}
struct Request {
id: i32,
body: &'static str,
}
struct Response {
id: i32,
body: String,
}
fn respond(request: Request) -> Response {
let body = format!("ok:{}", request.body);
Response { id: request.id, body }
}
fn main() {
let request_id = 42;
let request = Request { id: request_id, body: "status" };
let response = respond(request);
println!("{}:{}", response.id, response.body);
}
struct Request {
id: i32,
body: &'static str,
}
struct Response {
id: i32,
body: String,
}
fn respond(request: Request) -> Response {
let body = format!("ok:{}", request.body);
Response { id: request.id, body }
}
request_id ← 7, request ← (empty)
1fn main() {2 let request_i→ 7d = 7; //@request_id=7, 1, 423 let reques→ (empty)t = Request { id: request_i7d, body: "status" };4 let response = respond(reques(empty)t);5 println!("{}:{}", response.id, response.body);body ← "ok:status"
18fn respond(request: Request) -> Response {19 let bod→ "ok:status"y = format!("ok:{}", request.body);20 Response { id: request.i7d, bod"ok:status"y }21}response ← (empty)
3 let request = Request { id: request_id, body: "status" };4 let respons→ (empty)e = respond(reques(empty)t);5 println!("{}:{}", response.id, response.body);6}output7:ok:status
request_id ← 1, request ← (empty)
1fn main() {2 let request_i→ 1d = 1;3 let reques→ (empty)t = Request { id: request_i1d, body: "status" };4 let response = respond(reques(empty)t);5 println!("{}:{}", response.id, response.body);body ← "ok:status"
18fn respond(request: Request) -> Response {19 let bod→ "ok:status"y = format!("ok:{}", request.body);20 Response { id: request.i1d, bod"ok:status"y }21}response ← (empty)
3 let request = Request { id: request_id, body: "status" };4 let respons→ (empty)e = respond(reques(empty)t);5 println!("{}:{}", response.id, response.body);6}output1:ok:status
request_id ← 42, request ← (empty)
1fn main() {2 let request_i→ 42d = 42;3 let reques→ (empty)t = Request { id: request_i42d, body: "status" };4 let response = respond(reques(empty)t);5 println!("{}:{}", response.id, response.body);body ← "ok:status"
18fn respond(request: Request) -> Response {19 let bod→ "ok:status"y = format!("ok:{}", request.body);20 Response { id: request.i42d, bod"ok:status"y }21}response ← (empty)
3 let request = Request { id: request_id, body: "status" };4 let respons→ (empty)e = respond(reques(empty)t);5 println!("{}:{}", response.id, response.body);6}output42:ok:status
request id
`id` is copied from the request to the response so callers can correlate messages.
payload
`body` is transformed from request text into response text.
ownership
`respond` consumes the request and returns a new response value.