Crate nom_bufreader_rp
source ·Expand description
This crate provides a BufReader
alternative that can be used with
nom parsers
It will hide for you the Incomplete handling in nom for streaming parsers, retrying and refilling buffers automatically.
For synchronous io, use bufreader::BufReader
, while for asynchronous
IO, you should use async_bufreader::BufReader
Examples
sync
ⓘ
use nom_bufreader::bufreader::BufReader;
use nom_bufreader::{Error, Parse};
use std::{net::TcpListener, str::from_utf8};
fn main() -> Result<(), Error<()>> {
let listener = TcpListener::bind("127.0.0.1:8080")?;
let mut i = BufReader::new(listener.incoming().next().unwrap()?);
// method, space and path are nom parsers
let m = i.parse(method)?;
let _ = i.parse(space)?;
let p = i.parse(path)?;
println!("got method {}, path {}", m, p);
Ok(())
}
async
tokio
ⓘ
use nom_bufreader::async_bufreader::BufReader;
use nom_bufreader::{AsyncParse, Error};
use std::str::from_utf8;
use tokio_util::compat::TokioAsyncReadCompatExt;
use tokio::net::TcpListener;
#[tokio::main]
async fn main() -> Result<(), Error<()>> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
let mut i = BufReader::new(listener.accept().await?.0.compat());
let m = i.parse(method).await?;
let _ = i.parse(space).await?;
let p = i.parse(path).await?;
println!("got method {}, path {}", m, p);
Ok(())
}
async-std
ⓘ
use nom_bufreader::async_bufreader::BufReader;
use nom_bufreader::{AsyncParse, Error};
use std::str::from_utf8;
use async_std::net::TcpListener;
#[async_std::main]
async fn main() -> Result<(), Error<()>> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
let mut i = BufReader::new(listener.accept().await?.0);
let m = i.parse(method).await?;
let _ = i.parse(space).await?;
let p = i.parse(path).await?;
println!("got method {}, path {}", m, p);
Ok(())
}