1use std::future::pending;23use anyhow::Result;4use bifrostlink::{Rpc, Rtt};5use bifrostlink_ports::stdio::from_stdio;6use tokio::runtime::Builder;78pub mod host;910pub use bifrostlink;11pub use remowt_link_shared::{self, Address, BifConfig, Fs, Pty, Systemd};1213pub 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}2021pub fn host_address() -> Result<Address> {22 let arg = std::env::args()23 .nth(2)24 .ok_or_else(|| anyhow::anyhow!("missing host address argument"))?;25 serde_json::from_str(&arg).map_err(|e| anyhow::anyhow!("invalid host address {arg:?}: {e}"))26}2728pub fn run<F>(register: F) -> Result<()>29where30 F: FnOnce(&mut Rpc<BifConfig>),31{32 tracing_subscriber::fmt()33 .with_writer(std::io::stderr)34 .init();3536 let index = plugin_index()?;37 let host = host_address()?;38 let runtime = Builder::new_current_thread().enable_all().build()?;39 runtime.block_on(async move {40 let mut rpc = Rpc::<BifConfig>::new(Address::Plugin(index));41 rpc.add_direct(host, from_stdio(), Rtt(0));42 register(&mut rpc);43 let _rpc = rpc;44 pending::<Result<()>>().await45 })46}