An open API service indexing awesome lists of open source software.

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

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(())
}
```