diff --git a/module-request-ai/src/buffer.rs b/module-request-ai/src/buffer.rs index 99556b6..51e5008 100644 --- a/module-request-ai/src/buffer.rs +++ b/module-request-ai/src/buffer.rs @@ -38,14 +38,14 @@ enum State { } pub struct Buffer { - pub buf: Vec, + pub buf: String, state: State, } impl Buffer { pub fn new() -> Self { Buffer { - buf: vec![], + buf: String::new(), state: State::Write, } } @@ -53,12 +53,12 @@ impl Buffer { match self.state { State::Write => self.proc_write(data), State::Think => self.proc_think(data), - State::Buf => self.buf.push(data.to_string()), + State::Buf => self.buf.push_str(data), } } pub fn print_return_remain(&mut self) -> String { - let buffered = self.buf.join("").trim().to_string(); + let buffered = self.buf.trim().to_string(); self.buf.clear(); if self.state == State::Buf { return buffered; @@ -75,15 +75,14 @@ impl Buffer { fn proc_write(&mut self, data: &str) { if !data.contains("\n") { - self.buf.push(data.to_string()); - let buffered = self.buf.join("").trim().to_string(); + self.buf.push_str(data); + let buffered = self.buf.trim().to_string(); let filled = fill(&buffered); if let Some(filled) = filled { self.buf.clear(); let formatted = clear_format(&filled); eprint!("{}", formatted); - self.buf - .push(formatted.split_once("\n").unwrap().1.to_string()); + self.buf.push_str(formatted.split_once("\n").unwrap().1); std::io::stdout().flush().unwrap(); return; } @@ -97,8 +96,8 @@ impl Buffer { let lines = data.split_once("\n").unwrap(); let first = lines.0; let last = lines.1; - self.buf.push(first.to_string()); - let buffered = self.buf.join("").trim().to_string(); + self.buf.push_str(first); + let buffered = self.buf.trim().to_string(); self.buf.clear(); if buffered.ends_with("") { let warn = format!("{}:", t!("ai-suggestion")) @@ -148,15 +147,14 @@ impl Buffer { fn proc_think(&mut self, data: &str) { if !data.contains("\n") { - self.buf.push(data.to_string()); - let buffered = self.buf.join("").trim().to_string(); + self.buf.push_str(data); + let buffered = self.buf.trim().to_string(); let filled = fill(&buffered); if let Some(filled) = filled { self.buf.clear(); let formatted = clear_format(&filled); eprint!("{}", formatted); - self.buf - .push(formatted.split_once("\n").unwrap().1.to_string()); + self.buf.push_str(formatted.split_once("\n").unwrap().1); std::io::stdout().flush().unwrap(); return; } @@ -170,8 +168,8 @@ impl Buffer { let lines = data.split_once("\n").unwrap(); let first = lines.0; let last = lines.1; - self.buf.push(first.to_string()); - let buffered = self.buf.join("").trim().to_string(); + self.buf.push_str(first); + let buffered = self.buf.trim().to_string(); self.buf.clear(); if buffered.ends_with("") { let tag = ""; diff --git a/module-request-ai/src/requests.rs b/module-request-ai/src/requests.rs index 0e9e397..b1932a1 100644 --- a/module-request-ai/src/requests.rs +++ b/module-request-ai/src/requests.rs @@ -130,27 +130,27 @@ pub async fn ai_suggestion(last_command: &str, error_msg: &str) { .await; let mut stream = res.unwrap().bytes_stream(); - let mut json_buffer = vec![]; + let mut json_buffer = String::new(); let mut buffer = buffer::Buffer::new(); while let Some(item) = stream.next().await { let item = item.unwrap(); let str = std::str::from_utf8(&item).unwrap(); if json_buffer.is_empty() { - json_buffer.push(str.to_string()); + json_buffer.push_str(str); continue; } if !str.contains("\n\ndata: {") { - json_buffer.push(str.to_string()); + json_buffer.push_str(str); continue; } let data_loc = str.find("\n\ndata: {").unwrap(); let split = str.split_at(data_loc); - json_buffer.push(split.0.to_string()); - let working_str = json_buffer.join(""); + json_buffer.push_str(split.0); + let working_str = json_buffer.clone(); json_buffer.clear(); - json_buffer.push(split.1.to_string()); + json_buffer.push_str(split.1); for part in working_str.split("\n\n") { if let Some(data) = part.strip_prefix("data: ") { @@ -168,7 +168,7 @@ pub async fn ai_suggestion(last_command: &str, error_msg: &str) { } } if !json_buffer.is_empty() { - let working_str = json_buffer.join(""); + let working_str = json_buffer.clone(); for part in working_str.split("\n\n") { if let Some(data) = part.strip_prefix("data: ") { if data == "[DONE]" {