use ferrin_message::Message;
use ferrin_spec::FinishReason;
use ferrin_spec::ProviderMetadata;
use ferrin_spec::Usage;
use ferrin_spec::Warning;
use super::StepResult;
#[derive(Debug, Clone, PartialEq)]
pub struct GenerateTextResult<O> {
pub steps: Vec<StepResult>,
pub total_usage: Usage,
pub output: O,
}
impl<O> GenerateTextResult<O> {
#[must_use]
pub fn last_step(&self) -> &StepResult {
#[allow(clippy::expect_used, reason = "the loop records at least one step")]
self.steps.last().expect("at least one step")
}
#[must_use]
pub fn text(&self) -> String {
self.last_step().text()
}
#[must_use]
pub fn reasoning_text(&self) -> Option<String> {
self.last_step().reasoning_text()
}
#[must_use]
pub fn finish_reason(&self) -> &FinishReason {
&self.last_step().finish_reason
}
#[must_use]
pub fn usage(&self) -> &Usage {
&self.last_step().usage
}
#[must_use]
pub fn provider_metadata(&self) -> Option<&ProviderMetadata> {
self.last_step().provider_metadata.as_ref()
}
#[must_use]
pub fn warnings(&self) -> &[Warning] {
&self.last_step().warnings
}
#[must_use]
pub fn response_messages(&self) -> Vec<Message> {
self.steps
.iter()
.flat_map(|step| step.response.messages.iter().cloned())
.collect()
}
pub fn map_output<P>(self, f: impl FnOnce(O) -> P) -> GenerateTextResult<P> {
GenerateTextResult {
steps: self.steps,
total_usage: self.total_usage,
output: f(self.output),
}
}
}