swarm repositories / source
summaryrefslogtreecommitdiff
path: root/crates/libmcp-testkit
diff options
context:
space:
mode:
Diffstat (limited to 'crates/libmcp-testkit')
-rw-r--r--crates/libmcp-testkit/Cargo.toml15
-rw-r--r--crates/libmcp-testkit/src/lib.rs32
2 files changed, 47 insertions, 0 deletions
diff --git a/crates/libmcp-testkit/Cargo.toml b/crates/libmcp-testkit/Cargo.toml
new file mode 100644
index 0000000..b8e68b1
--- /dev/null
+++ b/crates/libmcp-testkit/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "libmcp-testkit"
+version.workspace = true
+edition.workspace = true
+license.workspace = true
+rust-version.workspace = true
+description.workspace = true
+readme.workspace = true
+
+[dependencies]
+serde.workspace = true
+serde_json.workspace = true
+
+[lints]
+workspace = true
diff --git a/crates/libmcp-testkit/src/lib.rs b/crates/libmcp-testkit/src/lib.rs
new file mode 100644
index 0000000..9f33643
--- /dev/null
+++ b/crates/libmcp-testkit/src/lib.rs
@@ -0,0 +1,32 @@
+//! Shared test helpers for `libmcp` consumers.
+
+use serde::de::DeserializeOwned;
+use std::{
+ fs::File,
+ io::{self, BufRead, BufReader},
+ path::Path,
+};
+
+/// Reads an append-only JSONL file into typed records.
+pub fn read_json_lines<T>(path: &Path) -> io::Result<Vec<T>>
+where
+ T: DeserializeOwned,
+{
+ let file = File::open(path)?;
+ let reader = BufReader::new(file);
+ let mut records = Vec::new();
+ for line in reader.lines() {
+ let line = line?;
+ if line.trim().is_empty() {
+ continue;
+ }
+ let parsed = serde_json::from_str::<T>(line.as_str()).map_err(|error| {
+ io::Error::new(
+ io::ErrorKind::InvalidData,
+ format!("invalid JSONL test record: {error}"),
+ )
+ })?;
+ records.push(parsed);
+ }
+ Ok(records)
+}