5 个版本 (3 个破坏性版本)

0.4.1-alpha12023 年 9 月 19 日
0.3.1-alpha12023 年 7 月 13 日
0.3.0-alpha12023 年 7 月 13 日
0.2.0-alpha12022 年 11 月 25 日
0.1.0-alpha12022 年 11 月 13 日

#115调试

Download history 2623/week @ 2024-04-21 2334/week @ 2024-04-28 2250/week @ 2024-05-05 1962/week @ 2024-05-12 2429/week @ 2024-05-19 2241/week @ 2024-05-26 2540/week @ 2024-06-02 2737/week @ 2024-06-09 2676/week @ 2024-06-16 2609/week @ 2024-06-23 1967/week @ 2024-06-30 2067/week @ 2024-07-07 2300/week @ 2024-07-14 2233/week @ 2024-07-21 3043/week @ 2024-07-28 2525/week @ 2024-08-04

10,148 每月下载量
2 crates 中使用

MIT/Apache

195KB
2K SLoC

dap-rs,调试适配器协议的 Rust 实现

简介

这个包是 调试适配器协议 (简称 DAP) 的 Rust 实现。

最好将 DAP 与 LSP (语言服务器协议) 进行比较,但它是为调试器设计的。核心思想是相同的:一个协议作为编辑器和调试器之间交流的通用语言。这意味着实现了 DAP 的编辑器可以使用也实现了 DAP 的调试器。

在实践中,适配器可能与实际的调试器分开。例如,可以实现在 gdb 子进程的标准输入上写入命令的适配器,然后解析它接收的输出(这就是为什么它被称为“适配器”——它使调试器适应了解 DAP 的编辑器)。

稳定性

这个包处于相当早期阶段,破坏性会频繁发生。任何低于 1.0 的版本可能都是破坏性版本。

最小示例

要开始,创建一个二进制项目,并在你的 Cargo.toml 中添加 dap

[package]
name = "dummy-server"
version = "*"
edition = "2021"

[dependencies]
dap = "*"

我们的示例服务器将从文本文件读取输入,并将输出写入标准输出。

use std::fs::File;
use std::io::{BufReader, BufWriter};

use thiserror::Error;

use dap::prelude::*;

#[derive(Error, Debug)]
enum MyAdapterError {
  #[error("Unhandled command")]
  UnhandledCommandError,

  #[error("Missing command")]
  MissingCommandError,
}

type DynResult<T> = std::result::Result<T, Box<dyn std::error::Error>>;

fn main() -> DynResult<()> {
  let output = BufWriter::new(std::io::stdout());
  let f = File::open("testinput.txt")?;
  let input = BufReader::new(f);
  let mut server = Server::new(input, output);

  let req = match server.poll_request()? {
    Some(req) => req,
    None => return Err(Box::new(MyAdapterError::MissingCommandError)),
  };
  if let Command::Initialize(_) = req.command {
    let rsp = req.success(
      ResponseBody::Initialize(Some(types::Capabilities {
        ..Default::default()
      })),
    );

    // When you call respond, send_event etc. the message will be wrapped
    // in a base message with a appropriate seq number, so you don't have to keep track of that yourself
    server.respond(rsp)?;

    server.send_event(Event::Initialized)?;
  } else {
    return Err(Box::new(MyAdapterError::UnhandledCommandError));
  }
  Ok(())
}

许可证

这个库以 MIT 和 Apache 2.0 双许可。这意味着用户可以选择这两者之一。通常,这些是非限制性、非病毒许可证,也称为“你想做什么都可以,但我不能保证”。

商业支持可在合同基础上获得(联系我:[email protected])。

依赖关系

~0.8–2MB
~41K SLoC