use futures::stream::StreamExt;
use crate::errors::Result;
use crate::types::config::ClaudeAgentOptions;
use crate::types::messages::Message;
use super::message_parser::{MessageParser, ParsingMode, parse_with_mode};
use super::transport::subprocess::QueryPrompt;
use super::transport::{SubprocessTransport, Transport};
pub struct InternalClient {
transport: SubprocessTransport,
parsing_mode: ParsingMode,
}
impl InternalClient {
pub fn new(prompt: QueryPrompt, options: ClaudeAgentOptions) -> Result<Self> {
let parsing_mode = options.parsing_mode;
let transport = SubprocessTransport::new(prompt, options)?;
Ok(Self { transport, parsing_mode })
}
pub async fn execute(mut self) -> Result<Vec<Message>> {
self.transport.connect().await?;
let mut messages = Vec::new();
match self.parsing_mode {
ParsingMode::ZeroCopy => {
let mut stream = self.transport.read_raw_messages();
while let Some(result) = stream.next().await {
let json = result?;
let message = parse_with_mode(&json, ParsingMode::ZeroCopy)?;
messages.push(message);
}
}
ParsingMode::Traditional => {
let mut stream = self.transport.read_messages();
while let Some(result) = stream.next().await {
let json = result?;
let message = MessageParser::parse(json)?;
messages.push(message);
}
}
}
self.transport.close().await?;
Ok(messages)
}
}