use serde::{Deserialize, Serialize};
use super::ResourceContents;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReadResourceResult {
pub contents: Vec<ResourceContents>,
}
impl ReadResourceResult {
pub fn text(uri: impl Into<String>, text: impl Into<String>) -> Self {
Self {
contents: vec![ResourceContents::text(uri, text)],
}
}
pub fn text_with_mime(
uri: impl Into<String>,
text: impl Into<String>,
mime_type: impl Into<String>,
) -> Self {
Self {
contents: vec![ResourceContents::text(uri, text).with_mime_type(mime_type)],
}
}
pub fn blob(uri: impl Into<String>, blob: impl Into<String>) -> Self {
Self {
contents: vec![ResourceContents::blob(uri, blob)],
}
}
pub fn from_blob(uri: impl Into<String>, data: Vec<u8>) -> Self {
use base64::Engine;
let encoded = base64::engine::general_purpose::STANDARD.encode(&data);
Self {
contents: vec![ResourceContents::blob(uri, encoded)],
}
}
pub fn with_contents(contents: Vec<ResourceContents>) -> Self {
Self { contents }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_text_result_serialize() {
let result = ReadResourceResult::text("file:///readme.md", "# Hello");
let json = serde_json::to_value(&result).unwrap();
assert_eq!(json["contents"][0]["type"], "text");
assert_eq!(json["contents"][0]["uri"], "file:///readme.md");
assert_eq!(json["contents"][0]["text"], "# Hello");
}
#[test]
fn test_multi_contents_result_serialize() {
let result = ReadResourceResult::with_contents(vec![
ResourceContents::text("file:///a.txt", "A"),
ResourceContents::text("file:///b.txt", "B"),
]);
let json = serde_json::to_value(&result).unwrap();
assert_eq!(json["contents"].as_array().unwrap().len(), 2);
}
#[test]
fn test_blob_result_serialize() {
let result = ReadResourceResult::blob("file:///img.png", "abcd");
let json = serde_json::to_value(&result).unwrap();
assert_eq!(json["contents"][0]["type"], "blob");
assert_eq!(json["contents"][0]["blob"], "abcd");
}
}