5个版本

使用旧的Rust 2015

0.1.4 2017年9月8日
0.1.3 2017年9月8日
0.1.2 2017年9月8日
0.1.1 2017年9月8日
0.1.0 2017年9月8日

#23 in #listener


用于 rapt_derive

MIT/Apache

29KB
259

Rapt

构建状态(Linux) Build Status
项目状态 可用,处于alpha和beta之间
生产就绪性 取决于您的风险承受能力

Rapt是Rust的运行时应用程序仪器工具包。

贡献

这个项目处于初期阶段,我们始终欢迎贡献者。

我们的目标是鼓励无障碍的贡献到项目中。为了实现这一点,我们使用Unprotocols C4流程。请阅读它,它将回答许多问题。我们的目标是尽快合并拉取请求并定期发布新稳定版本。

简而言之,这意味着

  • 我们快速合并拉取请求(try!)
  • 我们欢迎各种想法
  • 我们更倾向于先有代码,后有共识

要了解更多信息,请阅读我们的 贡献指南


lib.rs:

Rapt

运行时应用程序仪器工具包

Rapt为Rust库和应用程序提供了一种标准接口,以提供运行时内省功能。

此库有几个关键组件

仪器

Instrument 是一个Serde序列化值的线程安全包装器。它是基于 Listener

仪器是可克隆的,并且可以安全地使用 Instrument#update 更新包装的值。

仪器板

仪器板是将多个 仪器 聚合到单个结构中并为其实现或推导 Instruments 的概念。请注意,如果使用推导(使用 rapt_derive 包),最后一个类型参数 必须 绑定到 Listener

extern crate rapt;
extern crate serde;
#[macro_use]
extern crate rapt_derive;

use serde::Serialize;
use rapt::{Listener, Instrument};

#[allow(dead_code)]
#[derive(Instruments)]
struct AppInstruments<T : Serialize, L: Listener> {
    value: Instrument<T, L>,
}

pub fn main() {}

在上面的示例中,L 必须 始终保持最后一个类型参数。

它是基于 Listener 的。

监听器

Listener 是一个允许仪器通知相关方关于更新的特质

示例

extern crate rapt;
extern crate serde;

#[macro_use]
extern crate rapt_derive;
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate assert_matches;

use serde::Serialize;
use rapt::{Listener, Instrument};

#[derive(Debug, Clone, Copy, Serialize)]
enum Status { Stopped, Started }

#[derive(Clone, Serialize)]
struct Service {
    status: Status,
}

#[derive(Instruments)]
struct AppInstruments<L: Listener> {
    http_server: Instrument<Service, L>,
}

use std::thread;
use std::time::Duration;

fn main() {
    let app_instruments = AppInstruments::<()> {
        http_server: Instrument::new(Service { status: Status::Stopped }),
    };
    let http_server_svc = app_instruments.http_server.clone();
    let thread_handle = thread::spawn(move || {
        thread::sleep(Duration::from_millis(100));
        let _ = http_server_svc.update(|v| v.status = Status::Started).unwrap();
    });
    thread::sleep(Duration::from_millis(200));
    assert_matches!(app_instruments.http_server.read().and_then(|v| Ok(v.status)), Ok(Status::Started));
    let _ = thread_handle.join().unwrap();
}

依赖关系

~0.1–1MB
~17K SLoC