use tokio::io::{AsyncRead, AsyncReadExt};
use crate::streaming::StreamParser;
use crate::{Document, HtmlError};
const BUF_SIZE: usize = 64 * 1024;
pub struct AsyncParser<R> {
reader: R,
buf_size: usize,
}
impl<R: AsyncRead + Unpin> AsyncParser<R> {
pub fn new(reader: R) -> Self {
Self {
reader,
buf_size: BUF_SIZE,
}
}
pub fn with_buf_size(mut self, size: usize) -> Self {
self.buf_size = size.max(1);
self
}
pub async fn parse(mut self) -> Result<Document, HtmlError> {
let mut parser = StreamParser::new();
let mut buf = vec![0u8; self.buf_size];
loop {
let n = self.reader.read(&mut buf).await?;
if n == 0 {
break;
}
parser.feed(&buf[..n]);
}
parser.finish()
}
}
pub async fn parse_async<R: AsyncRead + Unpin>(reader: R) -> Result<Document, HtmlError> {
AsyncParser::new(reader).parse().await
}