use serde::Serialize;
use serde_json::Value;
use crate::Result;
use crate::bindings::oino::extension::session as ws;
pub use crate::bindings::oino::extension::session::{Delivery, Provenance, SessionsScope};
use crate::error::parse;
pub fn header() -> Result<Value> {
parse(&ws::header())
}
#[must_use]
pub fn session_id() -> String {
ws::session_id()
}
#[must_use]
pub fn session_file() -> Option<String> {
ws::session_file()
}
#[must_use]
pub fn leaf_id() -> Option<String> {
ws::leaf_id()
}
pub fn entry(id: &str) -> Result<Option<Value>> {
ws::entry(id).map(|t| parse(&t)).transpose()
}
pub fn entries() -> Result<Vec<Value>> {
parse(&ws::entries())
}
pub fn branch(from: Option<&str>) -> Result<Vec<Value>> {
parse(&ws::branch(from))
}
pub fn context_entries() -> Result<Vec<Value>> {
parse(&ws::context_entries())
}
pub fn projection() -> Result<Value> {
parse(&ws::projection())
}
pub fn tree() -> Result<Value> {
parse(&ws::tree())
}
#[must_use]
pub fn label(id: &str) -> Option<String> {
ws::label(id)
}
#[must_use]
pub fn session_name() -> Option<String> {
ws::session_name()
}
pub fn set_session_name(name: Option<&str>) -> Result<()> {
Ok(ws::set_session_name(name)?)
}
pub fn set_label(id: &str, label: Option<&str>) -> Result<()> {
Ok(ws::set_label(id, label)?)
}
pub fn append_entry(custom_type: &str, data: Option<&impl Serialize>) -> Result<String> {
let data = data.map(serde_json::to_string).transpose()?;
Ok(ws::append_entry(custom_type, data.as_deref())?)
}
#[derive(Clone, Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CustomMessage {
pub custom_type: String,
pub content: Value,
pub display: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<Value>,
}
#[derive(Clone, Debug, Default)]
pub struct SendOptions {
pub trigger_turn: bool,
pub deliver_as: Option<Delivery>,
pub provenance: Option<Provenance>,
}
pub async fn send_message(message: &CustomMessage, options: SendOptions) -> Result<()> {
let opts = ws::SendOptions {
trigger_turn: options.trigger_turn,
deliver_as: options.deliver_as,
provenance: options.provenance,
};
Ok(ws::send_message(serde_json::to_string(message)?, opts).await?)
}
pub async fn send_user_message(content: &Value, deliver_as: Option<Delivery>) -> Result<()> {
let opts = ws::UserMessageOptions {
deliver_as,
expand_prompt_templates: false,
provenance: None,
};
Ok(ws::send_user_message(content.to_string(), opts).await?)
}
pub async fn list_sessions(scope: SessionsScope) -> Result<Vec<Value>> {
parse(&ws::sessions_list(scope).await?)
}
pub async fn read_session(path: &str) -> Result<Value> {
parse(&ws::session_read(path.to_owned()).await?)
}