https://github.com/rust-bakery/nom-bufreader
BufReader adapter for nom parsers
https://github.com/rust-bakery/nom-bufreader
Last synced: 11 months ago
JSON representation
BufReader adapter for nom parsers
- Host: GitHub
- URL: https://github.com/rust-bakery/nom-bufreader
- Owner: rust-bakery
- License: mit
- Created: 2021-08-04T17:49:17.000Z (almost 5 years ago)
- Default Branch: main
- Last Pushed: 2023-03-19T11:15:16.000Z (over 3 years ago)
- Last Synced: 2025-07-08T02:14:18.968Z (12 months ago)
- Language: Rust
- Size: 31.3 KB
- Stars: 11
- Watchers: 4
- Forks: 6
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# nom-bufreader, adapters for BufReader around nom
**/!\Work in progress, if you put it in production, you fix it/!\**
With this crate, you can assemble a nom parser with a `BufReader` alternative, synchronous or asynchronous.
Due to incompatible buffering strategies, [std::io::BufReader](https://doc.rust-lang.org/stable/std/io/struct.BufReader.html)
and [futures::io::BufReader](https://docs.rs/futures/0.3.16/futures/io/struct.BufReader.html)
cannot be used directly. This crate proovide compatible forks instead, in the
`bufreader` and `async_bufreader` modules.
It will hide for you the [Incomplete](https://docs.rs/nom/7.0.0/nom/enum.Err.html#variant.Incomplete) handling in nom for streaming parsers, retrying and refilling buffers automatically.
## Examples
### sync
```rust
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
```rust
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
```rust
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(())
}
```