use serde::{Deserialize, Serialize};
use serde_json::Value;
use starweaver_core::Metadata;
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct FileRef {
pub uri: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub media_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
impl FileRef {
#[must_use]
pub fn new(uri: impl Into<String>) -> Self {
Self {
uri: uri.into(),
media_type: None,
name: None,
}
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct BinaryRef {
pub uri: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub media_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bytes: Option<u64>,
}
impl BinaryRef {
#[must_use]
pub fn new(uri: impl Into<String>) -> Self {
Self {
uri: uri.into(),
media_type: None,
bytes: None,
}
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum InputPart {
Text {
text: String,
#[serde(default, skip_serializing_if = "Metadata::is_empty")]
metadata: Metadata,
},
Url {
url: String,
#[serde(default, skip_serializing_if = "Metadata::is_empty")]
metadata: Metadata,
},
File {
file: FileRef,
#[serde(default, skip_serializing_if = "Metadata::is_empty")]
metadata: Metadata,
},
Binary {
binary: BinaryRef,
#[serde(default, skip_serializing_if = "Metadata::is_empty")]
metadata: Metadata,
},
Mode {
mode: String,
#[serde(default, skip_serializing_if = "Value::is_null")]
config: Value,
#[serde(default, skip_serializing_if = "Metadata::is_empty")]
metadata: Metadata,
},
Command {
command: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
args: Vec<String>,
#[serde(default, skip_serializing_if = "Value::is_null")]
payload: Value,
#[serde(default, skip_serializing_if = "Metadata::is_empty")]
metadata: Metadata,
},
}
impl InputPart {
#[must_use]
pub fn text(text: impl Into<String>) -> Self {
Self::Text {
text: text.into(),
metadata: Metadata::default(),
}
}
#[must_use]
pub fn url(url: impl Into<String>) -> Self {
Self::Url {
url: url.into(),
metadata: Metadata::default(),
}
}
#[must_use]
pub fn command(command: impl Into<String>, args: Vec<String>) -> Self {
Self::Command {
command: command.into(),
args,
payload: Value::Null,
metadata: Metadata::default(),
}
}
}