openrouter-rs 0.9.0

A type-safe OpenRouter Rust SDK
Documentation
use std::io::Error;

use futures_util::{StreamExt, TryStreamExt, stream, stream::BoxStream};
use reqwest::Response;
use tokio::io::{AsyncBufReadExt, BufReader};
use tokio_util::io::StreamReader;

pub(crate) fn response_lines(response: Response) -> BoxStream<'static, std::io::Result<String>> {
    let byte_stream = response.bytes_stream().map_err(Error::other);
    let lines = BufReader::new(StreamReader::new(byte_stream)).lines();

    stream::unfold(lines, |mut lines| async move {
        match lines.next_line().await {
            Ok(Some(line)) => Some((Ok(line), lines)),
            Ok(None) => None,
            Err(error) => Some((Err(error), lines)),
        }
    })
    .boxed()
}