Skip to main content

remowt_plugin/
lib.rs

1use std::future::pending;
2
3use anyhow::Result;
4use bifrostlink::{Rpc, Rtt};
5use bifrostlink_ports::stdio::from_stdio;
6use tokio::runtime::Builder;
7
8pub mod host;
9
10pub use bifrostlink;
11pub use remowt_link_shared::{self, Address, BifConfig, Fs, Pty, Systemd};
12
13pub fn plugin_index() -> Result<u16> {
14	let arg = std::env::args()
15		.nth(1)
16		.ok_or_else(|| anyhow::anyhow!("missing plugin index argument"))?;
17	arg.parse()
18		.map_err(|e| anyhow::anyhow!("invalid plugin index {arg:?}: {e}"))
19}
20
21pub fn run<F>(register: F) -> Result<()>
22where
23	F: FnOnce(&mut Rpc<BifConfig>),
24{
25	tracing_subscriber::fmt()
26		.with_writer(std::io::stderr)
27		.init();
28
29	let index = plugin_index()?;
30	let runtime = Builder::new_current_thread().enable_all().build()?;
31	runtime.block_on(async move {
32		let mut rpc = Rpc::<BifConfig>::new(Address::Plugin(index));
33		rpc.add_direct(Address::Agent, from_stdio(), Rtt(0));
34		register(&mut rpc);
35		let _rpc = rpc;
36		pending::<Result<()>>().await
37	})
38}