use anyhow::{Context, Result};
use std::io::{self, Read};
use vtcode_core::utils::tty::TtyExt;
pub(crate) fn build_print_prompt(print_value: String) -> Result<String> {
let piped_input = collect_piped_stdin()?;
let inline_prompt = if print_value.trim().is_empty() {
None
} else {
Some(print_value)
};
match (piped_input, inline_prompt) {
(Some(piped), Some(prompt)) => {
let mut combined = piped;
if !combined.ends_with("\n\n") {
if combined.ends_with('\n') {
combined.push('\n');
} else {
combined.push_str("\n\n");
}
}
combined.push_str(&prompt);
Ok(combined)
}
(Some(piped), None) => Ok(piped),
(None, Some(prompt)) => Ok(prompt),
(None, None) => Err(anyhow::anyhow!(
"No prompt provided. Pass text to -p/--print or pipe input via stdin."
)),
}
}
fn collect_piped_stdin() -> Result<Option<String>> {
let mut stdin = io::stdin();
if stdin.is_tty_ext() {
return Ok(None);
}
let mut buffer = String::new();
stdin
.read_to_string(&mut buffer)
.context("Failed to read prompt from stdin")?;
if buffer.trim().is_empty() {
Ok(None)
} else {
Ok(Some(buffer))
}
}