git.delta.rocks / remowt / refs/commits / 875f55ab11c2

difftreelog

source

crates/remowt-plugin/src/lib.rs1.2 KiBsourcehistory
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}