use aion_core::{
AssistantDocumentContext, AssistantDocumentPosition, AssistantDocumentSelection,
AssistantTurnContext,
};
#[must_use]
pub(crate) fn compose(context: Option<&AssistantTurnContext>, text: &str) -> String {
let prefix = context.map(format_turn_context).unwrap_or_default();
format!("{prefix}{text}")
}
#[must_use]
pub(crate) fn format_turn_context(context: &AssistantTurnContext) -> String {
let mut blocks: Vec<String> = Vec::new();
if let Some(url) = context.url.as_deref() {
blocks.push(if context.concepts.is_empty() {
format!("On screen: {url}")
} else {
format!("On screen: {url}\nShowing: {}", context.concepts.join(", "))
});
}
if let Some(document) = context.document.as_ref() {
blocks.push(format_document_block(document));
}
if blocks.is_empty() {
return String::new();
}
format!("{}\n\n", blocks.join("\n\n"))
}
#[must_use]
pub(crate) fn is_empty(context: &AssistantTurnContext) -> bool {
context.url.is_none() && context.concepts.is_empty() && context.document.is_none()
}
fn format_document_block(document: &AssistantDocumentContext) -> String {
let fenced = format!(
"Document: {}\n```awl\n{}\n```",
document.path, document.text
);
match (document.selection.as_ref(), document.cursor.as_ref()) {
(Some(selection), _) => format!("{fenced}\n{}", describe_selection(selection)),
(None, Some(cursor)) => {
format!("{fenced}\n{}\n{NOTHING_SELECTED}", describe_cursor(*cursor))
}
(None, None) => format!("{fenced}\n{NOTHING_SELECTED}"),
}
}
const NOTHING_SELECTED: &str = "Nothing is selected — the whole document is offered.";
fn describe_cursor(cursor: AssistantDocumentPosition) -> String {
format!(
"Cursor: line {}, column {}.",
cursor.line.saturating_add(1),
cursor.column.saturating_add(1)
)
}
fn describe_selection(selection: &AssistantDocumentSelection) -> String {
format!(
"Selected: line {}, column {} through line {}, column {}.",
selection.from.line.saturating_add(1),
selection.from.column.saturating_add(1),
selection.to.line.saturating_add(1),
selection.to.column.saturating_add(1)
)
}
#[cfg(test)]
#[path = "prompt_tests.rs"]
mod tests;