net-kit 0.1.0

Cross-platform network reachability monitoring with a single Net facade and Tokio runtime support.
Documentation
# net-kit

跨平台网络可达性监听库。对外仅暴露一个 `Net` 结构体,内部基于精简版
[`vibe-ready`](https://crates.io/crates/vibe-ready) 运行时驱动 [`netwatch`] 网络监听。

## 特性

- 单一对外 API 结构体 `Net`,所有内部逻辑隔离在 `inner` 模块。
- 支持两种运行时启动方式:
  - `start()`:使用库自带的运行时引擎。
  - `start_with_tokio_rt(handle)`:复用开发者自己的 Tokio 运行时(该运行时由调用方保活,`shutdown` 不会关闭它)。
- 注册多个监听回调,回调在引擎回调线程池上触发,不阻塞监听任务。
- Windows 下基于 `INetworkListManager` 判定 Internet 可达性。

## 用法

```rust
use std::time::Duration;
use net_utils::{Net, NetworkStatus};

#[tokio::main]
async fn main() {
    let net = Net::new();

    // 使用库自带运行时启动监听。
    net.start().await.expect("start failed");

    // 所有触碰内部状态的方法都返回 Result,错误(如内部锁损坏)会显式交还给
    // 开发者处理,库自身不会 panic。
    let reachability = net
        .local_network_reachability()
        .expect("query reachability failed");
    println!("reachability: {reachability:?}");

    // 注册网络状态变化监听(可注册多个)。未启动时返回 Ok(None)。
    let handle = net
        .register(Box::new(|status: NetworkStatus| {
            println!("network status changed: {status:?}");
        }))
        .expect("register failed")
        .expect("register requires start");

    tokio::time::sleep(Duration::from_secs(5)).await;

    net.unregister(handle).expect("unregister failed");
    net.shutdown().expect("shutdown failed");
}
```

完整的可运行示例见 [`demo`](../demo) crate,可通过 `cargo run -p demo` 运行(演示启动/查询/监听回调中打印当前网络名称/关闭的完整流程)。

## 生命周期

- `start` / `start_with_tokio_rt`:重复调用会被忽略;可在 `shutdown` 后再次调用以重建。
- `shutdown`:停止监听任务并销毁引擎,释放所有 `start` 创建的资源;重复调用会被忽略。

[`netwatch`]: https://crates.io/crates/netwatch