Skip to content

Commit

Permalink
DAP: Deserialize number IDs (helix-editor#10943)
Browse files Browse the repository at this point in the history
* Fix deserialization of id

* Removing external dependencies

This reverts commit 27962af.

* Fix incorrect import

* Adding tests

* Moved tests

---------

Co-authored-by: Sławomir Lech <[email protected]>
  • Loading branch information
2 people authored and Schuyler Mortimer committed Jul 10, 2024
1 parent 247ccdf commit 556eea9
Showing 1 changed file with 34 additions and 2 deletions.
36 changes: 34 additions & 2 deletions helix-dap/src/types.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use serde::{Deserialize, Serialize};
use serde::{Deserialize, Deserializer, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use std::path::PathBuf;
Expand Down Expand Up @@ -311,7 +311,8 @@ pub struct Variable {
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Module {
pub id: String, // TODO: || number
#[serde(deserialize_with = "from_number")]
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub path: Option<PathBuf>,
Expand All @@ -331,6 +332,23 @@ pub struct Module {
pub address_range: Option<String>,
}

fn from_number<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum NumberOrString {
Number(i64),
String(String),
}

match NumberOrString::deserialize(deserializer)? {
NumberOrString::Number(n) => Ok(n.to_string()),
NumberOrString::String(s) => Ok(s),
}
}

pub mod requests {
use super::*;
#[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)]
Expand Down Expand Up @@ -887,4 +905,18 @@ pub mod events {
pub offset: usize,
pub count: usize,
}

#[test]
fn test_deserialize_module_id_from_number() {
let raw = r#"{"id": 0, "name": "Name"}"#;
let module: super::Module = serde_json::from_str(raw).expect("Error!");
assert_eq!(module.id, "0");
}

#[test]
fn test_deserialize_module_id_from_string() {
let raw = r#"{"id": "0", "name": "Name"}"#;
let module: super::Module = serde_json::from_str(raw).expect("Error!");
assert_eq!(module.id, "0");
}
}

0 comments on commit 556eea9

Please sign in to comment.