no_std
uri parser build with nom.
Based on the grammar from http://www.faqs.org/rfcs/rfc3986.html appendix A.
All parsing is done completely in memory.
extern crate nom_uri;
use nom_uri::Uri;
use nom_uri::Host;
fn main() {
// Parsing
let uri = Uri::parse("https://127.0.0.1.com/api/versions?page=2").unwrap();
assert_eq!(uri.host(), Some(Host::V4("127.0.0.1")));
let uri = Uri::parse("https://example.com/foo/bar").unwrap();
let mut path_segments = uri.path_segments();
assert_eq!(path_segments.next(), Some("foo"));
assert_eq!(path_segments.next(), Some("bar"));
assert_eq!(path_segments.next(), None);
// Serializing
let mut uri = Uri::parse("https://example.com/data.csv").unwrap();
let buffer = &mut [b' '; 50][..];
assert_eq!(uri.as_str(buffer).unwrap(), "https://example.com/data.csv");
uri.set_fragment(Some("cell=4,1-6,2")).unwrap();
let uri_str = uri.as_str(buffer).unwrap();
assert_eq!(uri_str, "https://example.com/data.csv#cell=4,1-6,2");
}
Relation to url crate
This crate was build for no_std
environments and to be used without allocator. A nice side effect is that parsing can be done completely in memory. The returned Uri
object stores the parsed components as slices of the original input.
URL is better suited for normal rust programs with access to the standard library. This crate is inspired by the URL crate but differs in some details. For example this crate does not parse special characters (including spaces!). They have to be percent encoded before parsing ([space] => "%20"). The URL crate does this automatically. In general the URL crate has more advanced features, especially for everyday URL handling.