busyrpc 0.14.0

busyrpc provides synchronous/thread-pool implementations of rpc_pb.
Documentation
use std::fs::File;
use std::time::SystemTime;

use arrrg::CommandLine;
use arrrg_derive::CommandLine;

use biometrics::{Collector, PlainTextEmitter};

use busyrpc::{Server, ServerOptions, ServiceRegistry, SslOptions};

use rpc_pb::IoToZ;

#[derive(CommandLine, Debug, Default, Eq, PartialEq)]
struct BenchmarkOptions {
    #[arrrg(nested)]
    ssl: SslOptions,
    #[arrrg(nested)]
    server: ServerOptions,
}

fn main() {
    let (options, free) =
        BenchmarkOptions::from_command_line("Usage: busyrpc-benchmark-server [OPTIONS]");
    if !free.is_empty() {
        eprintln!("command takes no arguments");
        std::process::exit(1);
    }
    std::thread::spawn(|| {
        let mut collector = Collector::new();
        busyrpc::register_biometrics(&mut collector);
        let fout = File::create("/dev/stdout").unwrap();
        let mut emit = PlainTextEmitter::new(fout);
        loop {
            let now = SystemTime::now()
                .duration_since(SystemTime::UNIX_EPOCH)
                .expect("clock should never fail")
                .as_millis()
                .try_into()
                .expect("millis since epoch should fit u64");
            if let Err(e) = collector.emit(&mut emit, now) {
                eprintln!("collector error: {e}");
            }
            std::thread::sleep(std::time::Duration::from_millis(249));
        }
    });
    let services = ServiceRegistry::new();
    let (server, _) = Server::new(options.ssl, options.server, services)
        .as_z()
        .pretty_unwrap();
    server.serve().as_z().pretty_unwrap();
}