use std::any::type_name;
use anyhow::Result as AnyhowResult;
use bevy::{
ecs::hierarchy::ChildOf,
remote::{
builtin_methods::{
BrpQuery, BrpQueryFilter, BrpQueryParams, BrpWriteMessageParams, ComponentSelector,
BRP_QUERY_METHOD, BRP_WRITE_MESSAGE_METHOD,
},
http::{DEFAULT_ADDR, DEFAULT_PORT, DEFAULT_RENDER_PORT},
BrpRequest,
},
transform::components::Transform,
};
fn main() -> AnyhowResult<()> {
let host_part = format!("{DEFAULT_ADDR}:{DEFAULT_PORT}");
let url = format!("http://{host_part}/");
run_transform_only_query(&url)?;
run_query_root_entities(&url)?;
run_query_all_components_and_entities(&url)?;
let host_part2 = format!("{DEFAULT_ADDR}:{DEFAULT_RENDER_PORT}");
let url2 = format!("http://{host_part2}/");
run_transform_only_query(&url2)?;
run_query_root_entities(&url2)?;
run_query_all_components_and_entities(&url2)?;
send_app_exit(&url)?;
Ok(())
}
fn run_query_all_components_and_entities(url: &str) -> Result<(), anyhow::Error> {
let query_all_req = BrpRequest {
method: String::from(BRP_QUERY_METHOD),
id: Some(serde_json::to_value(1)?),
params: Some(
serde_json::to_value(BrpQueryParams {
data: BrpQuery {
components: Vec::default(),
option: ComponentSelector::All,
has: Vec::default(),
},
strict: false,
filter: BrpQueryFilter::default(),
})
.expect("Unable to convert query parameters to a valid JSON value"),
),
};
println!("query_all req: {query_all_req:#?}");
let query_all_res = ureq::post(url)
.send_json(query_all_req)?
.body_mut()
.read_json::<serde_json::Value>()?;
println!("{query_all_res:#}");
Ok(())
}
fn run_transform_only_query(url: &str) -> Result<(), anyhow::Error> {
let get_transform_request = BrpRequest {
method: String::from(BRP_QUERY_METHOD),
id: Some(serde_json::to_value(1)?),
params: Some(
serde_json::to_value(BrpQueryParams {
data: BrpQuery {
components: vec![type_name::<Transform>().to_string()],
..Default::default()
},
strict: false,
filter: BrpQueryFilter::default(),
})
.expect("Unable to convert query parameters to a valid JSON value"),
),
};
println!("transform request: {get_transform_request:#?}");
let res = ureq::post(url)
.send_json(get_transform_request)?
.body_mut()
.read_json::<serde_json::Value>()?;
println!("{res:#}");
Ok(())
}
fn run_query_root_entities(url: &str) -> Result<(), anyhow::Error> {
let get_transform_request = BrpRequest {
method: String::from(BRP_QUERY_METHOD),
id: Some(serde_json::to_value(1)?),
params: Some(
serde_json::to_value(BrpQueryParams {
data: BrpQuery {
components: Vec::default(),
option: ComponentSelector::All,
has: Vec::default(),
},
strict: false,
filter: BrpQueryFilter {
without: vec![type_name::<ChildOf>().to_string()],
with: Vec::default(),
},
})
.expect("Unable to convert query parameters to a valid JSON value"),
),
};
println!("transform request: {get_transform_request:#?}");
let res = ureq::post(url)
.send_json(get_transform_request)?
.body_mut()
.read_json::<serde_json::Value>()?;
println!("{res:#}");
Ok(())
}
fn send_app_exit(url: &str) -> Result<(), anyhow::Error> {
let write_message_request = BrpRequest {
method: String::from(BRP_WRITE_MESSAGE_METHOD),
id: Some(serde_json::to_value(1)?),
params: Some(
serde_json::to_value(BrpWriteMessageParams {
message: "bevy_app::app::AppExit".to_string(),
value: Some("Success".into()),
})
.expect("Unable to convert write message parameters to a valid JSON value"),
),
};
println!("write message request: {write_message_request:#?}");
let res = ureq::post(url)
.send_json(write_message_request)?
.body_mut()
.read_json::<serde_json::Value>()?;
println!("{res:#}");
Ok(())
}