llm_tool/types/
resource.rs1use alloc::string::{String, ToString};
4
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10pub struct ResourceDefinition {
11 #[serde(rename = "uriTemplate")]
13 pub uri_template: String,
14 pub name: String,
16 #[serde(default, skip_serializing_if = "String::is_empty")]
18 pub description: String,
19 #[serde(skip_serializing_if = "Option::is_none")]
21 pub mime_type: Option<String>,
22}
23
24pub type ResourceTemplateDefinition = ResourceDefinition;
26
27#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
29#[serde(untagged)]
30pub enum ResourceOutputContent {
31 #[serde(rename_all = "camelCase")]
33 Text {
34 uri: String,
36 #[serde(skip_serializing_if = "Option::is_none")]
38 mime_type: Option<String>,
39 text: String,
41 },
42 #[serde(rename_all = "camelCase")]
44 Blob {
45 uri: String,
47 #[serde(skip_serializing_if = "Option::is_none")]
49 mime_type: Option<String>,
50 blob: String,
52 },
53}
54
55#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57pub struct ResourceOutput {
58 pub contents: alloc::vec::Vec<ResourceOutputContent>,
60}
61
62impl ResourceOutput {
63 pub fn text(uri: impl Into<String>, mime_type: Option<&str>, text: impl Into<String>) -> Self {
65 Self {
66 contents: alloc::vec![ResourceOutputContent::Text {
67 uri: uri.into(),
68 mime_type: mime_type.map(ToString::to_string),
69 text: text.into(),
70 }],
71 }
72 }
73
74 pub fn blob(uri: impl Into<String>, mime_type: Option<&str>, blob: impl Into<String>) -> Self {
76 Self {
77 contents: alloc::vec![ResourceOutputContent::Blob {
78 uri: uri.into(),
79 mime_type: mime_type.map(ToString::to_string),
80 blob: blob.into(),
81 }],
82 }
83 }
84}