mirror of
https://github.com/bevyengine/bevy
synced 2024-12-24 20:13:07 +00:00
60cf7ca025
## Objective Closes #15408 (somewhat) ## Solution - Moved the existing HTTP transport to its own module with its own plugin (`RemoteHttpPlugin`) (disabled on WASM) - Swapped out the `smol` crate for the smaller crates it re-exports to make it easier to keep out non-wasm code (HTTP transport needs `async-io` which can't build on WASM) - Added a new public `BrpSender` resource holding the matching sender for the `BrpReceiver`' (formally `BrpMailbox`). This allows other crates to send `BrpMessage`'s to the "mailbox". ## Testing TODO --------- Co-authored-by: Matty <weatherleymatthew@gmail.com>
73 lines
2.3 KiB
Rust
73 lines
2.3 KiB
Rust
//! A simple command line client that allows issuing queries to a remote Bevy
|
|
//! app via the BRP.
|
|
|
|
use anyhow::Result as AnyhowResult;
|
|
use argh::FromArgs;
|
|
use bevy::remote::{
|
|
builtin_methods::{BrpQuery, BrpQueryFilter, BrpQueryParams, BRP_QUERY_METHOD},
|
|
http::DEFAULT_ADDR,
|
|
http::DEFAULT_PORT,
|
|
BrpRequest,
|
|
};
|
|
|
|
/// Struct containing the command-line arguments that can be passed to this example.
|
|
///
|
|
/// The components are passed by their full type names positionally, while `host`
|
|
/// and `port` are optional arguments which should correspond to those used on
|
|
/// the server.
|
|
///
|
|
/// When running this example in conjunction with the `server` example, the `host`
|
|
/// and `port` can be left as their defaults.
|
|
///
|
|
/// For example, to connect to port 1337 on the default IP address and query for entities
|
|
/// with `Transform` components:
|
|
/// ```text
|
|
/// cargo run --example client -- --port 1337 bevy_transform::components::transform::Transform
|
|
/// ```
|
|
#[derive(FromArgs)]
|
|
struct Args {
|
|
/// the host IP address to connect to
|
|
#[argh(option, default = "DEFAULT_ADDR.to_string()")]
|
|
host: String,
|
|
/// the port to connect to
|
|
#[argh(option, default = "DEFAULT_PORT")]
|
|
port: u16,
|
|
/// the full type names of the components to query for
|
|
#[argh(positional, greedy)]
|
|
components: Vec<String>,
|
|
}
|
|
|
|
/// The application entry point.
|
|
fn main() -> AnyhowResult<()> {
|
|
// Parse the arguments.
|
|
let args: Args = argh::from_env();
|
|
|
|
// Create the URL. We're going to need it to issue the HTTP request.
|
|
let host_part = format!("{}:{}", args.host, args.port);
|
|
let url = format!("http://{}/", host_part);
|
|
|
|
let req = BrpRequest {
|
|
jsonrpc: String::from("2.0"),
|
|
method: String::from(BRP_QUERY_METHOD),
|
|
id: Some(ureq::json!(1)),
|
|
params: Some(
|
|
serde_json::to_value(BrpQueryParams {
|
|
data: BrpQuery {
|
|
components: args.components,
|
|
option: Vec::default(),
|
|
has: Vec::default(),
|
|
},
|
|
filter: BrpQueryFilter::default(),
|
|
})
|
|
.expect("Unable to convert query parameters to a valid JSON value"),
|
|
),
|
|
};
|
|
|
|
let res = ureq::post(&url)
|
|
.send_json(req)?
|
|
.into_json::<serde_json::Value>()?;
|
|
|
|
println!("{:#}", res);
|
|
|
|
Ok(())
|
|
}
|