19 releases (breaking)
| 0.15.0 | Jun 16, 2026 |
|---|---|
| 0.14.0 | Aug 15, 2025 |
| 0.13.0 | May 16, 2025 |
| 0.11.0 | Mar 25, 2025 |
| 0.3.0 | Jul 24, 2020 |
#65 in Parser implementations
1,788,859 downloads per month
Used in 179 crates
(24 directly)
200KB
4.5K
SLoC
Structured Field Values for HTTP
sfv is an implementation of Structured Field Values for HTTP as specified in RFC 9651 for parsing and serializing HTTP field values (also known as "structured headers" or "structured trailers").
It also exposes a set of types that might be useful for defining new structured fields.
License
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
lib.rs:
sfv is an implementation of Structured Field Values for HTTP, as specified in RFC 9651 for parsing and serializing HTTP field values.
It also exposes a set of types that might be useful for defining new structured fields.
Data Structures
There are three types of structured fields:
Item-- anInteger,Decimal,String,Token,Byte Sequence,Boolean,Date, orDisplay String. It can have associatedParameters.List-- an array of zero or more members, each of which can be anItemor anInnerList, both of which can haveParameters.Dictionary-- an ordered map of name-value pairs, where the names are short textual strings and the values areItems or arrays ofItems(represented withInnerList), both of which can have associated parameters. There can be zero or more members, and their names are unique in the scope of theDictionarythey occur within.
There are also a few lower-level types used to construct structured field values:
BareItemis used asItem's value or as a parameter value inParameters.Parametersare an ordered map of key-value pairs that are associated with anItemorInnerList. The keys are unique within the scope theParametersthey occur within, and the values areBareItem.InnerListis an array of zero or moreItems. Can have associatedParameters.ListEntryrepresents eitherItemorInnerListas a member ofListor as member-value inDictionary.
Examples
Serialization
Serializes an Item:
use sfv::{Decimal, ItemSerializer, KeyRef, StringRef};
let serialized_item = ItemSerializer::new()
.bare_item(StringRef::from_str("foo")?)
.parameter(KeyRef::from_str("key")?, Decimal::try_from(13.45655)?)
.finish();
assert_eq!(serialized_item, r#""foo";key=13.457"#);
Serializes a List:
use sfv::{KeyRef, ListSerializer, StringRef, TokenRef};
let mut ser = ListSerializer::new();
ser.bare_item(TokenRef::from_str("tok")?);
{
let mut ser = ser.inner_list();
ser.bare_item(99).parameter(KeyRef::from_str("key")?, false);
ser.bare_item(StringRef::from_str("foo")?);
ser.finish().parameter(KeyRef::from_str("bar")?, true);
}
assert_eq!(
ser.finish().as_deref(),
Some(r#"tok, (99;key=?0 "foo");bar"#),
);
Serializes a Dictionary:
use sfv::{DictSerializer, KeyRef, StringRef};
let mut ser = DictSerializer::new();
ser.bare_item(KeyRef::from_str("key1")?, StringRef::from_str("apple")?);
ser.bare_item(KeyRef::from_str("key2")?, true);
ser.bare_item(KeyRef::from_str("key3")?, false);
assert_eq!(
ser.finish().as_deref(),
Some(r#"key1="apple", key2, key3=?0"#),
);
Crate features
-
parsed-types(enabled by default) -- When enabled, exposes fully owned typesItem,Dictionary,List, and their components, which can be obtained fromParser::parse, etc. These types are implemented using theindexmapcrate, so disabling this feature can avoid that dependency if parsing using a visitor (Parser::parse_item_with_visitor, etc.) is sufficient. -
arbitrary-- Implements theArbitrarytrait for this crate's types, making them easier to use with fuzzing.
Dependencies
~0.6–1.3MB
~29K SLoC