12 releases (3 stable)
| 1.0.2 | Feb 19, 2024 |
|---|---|
| 1.0.1 | Feb 11, 2024 |
| 1.0.0 | Nov 26, 2023 |
| 0.1.8 | Nov 9, 2023 |
| 0.1.6 | Oct 27, 2023 |
#305 in Encoding
59,827 downloads per month
Used in 12 crates
(5 directly)
59KB
1K
SLoC
serde extensions for the http crate types
Allows serializing and deserializing the following types from http:
ResponseRequestHeaderMapStatusCodeUriMethodHeaderNameHeaderValueuri::Authorityuri::Schemeuri::PathAndQueryVersion- Generic
HeaderMap<T>where the item is not aHeaderValue
Allows serializing and deserializing the above types wrapped in the following std container types:
OptionResultin theOkpositionVecVecDequeLinkedListHashMapas theKeyfor all exceptHeaderMap,Request, andResponse. As theValuefor all types.BTreeMapas theKeyonly forHeaderValue,StatusCode, andVersion. As theValuefor all types.HashSetfor all exceptHeaderMap,Request, andResponseBTreeSetonly forHeaderValue,StatusCode, andVersion
Installation
Run the following Cargo command in your project directory:
cargo add http-serde-ext
Or add the following line to your Cargo.toml:
http-serde-ext = "1.0.2"
Usage
This library is intended to be used with serde's derive feature.
Fields should use the appropriate #[serde(with = "...")] annotation for that
type. Full examples are provided in each module section of the docs.
use std::collections::*;
use http::*;
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct MyStruct {
#[serde(with = "http_serde_ext::response")]
base: Response<Vec<u8>>,
#[serde(with = "http_serde_ext::request::option", default)]
option: Option<Request<String>>,
#[serde(with = "http_serde_ext::method::vec")]
vec: Vec<Method>,
#[serde(with = "http_serde_ext::uri::vec_deque")]
vec_deque: VecDeque<Uri>,
#[serde(with = "http_serde_ext::header_map::linked_list")]
linked_list: LinkedList<HeaderMap>,
#[serde(with = "http_serde_ext::header_map_generic::hash_map")]
hash_map: HashMap<String, HeaderMap<String>>,
#[serde(with = "http_serde_ext::status_code::btree_map_key")]
btree_map: BTreeMap<StatusCode, i32>,
#[serde(with = "http_serde_ext::authority::hash_set")]
hash_set: HashSet<uri::Authority>,
}
This library can also be used to manually De/Serialize types if given a
De/Serializer. For example, when using serde_json:
let uri = http::Uri::default();
let serialized = http_serde_ext::uri::serialize(&uri, serde_json::value::Serializer).unwrap();
let deserialized = http_serde_ext::uri::deserialize(serialized).unwrap();
assert_eq!(uri, deserialized);
let mut responses: Vec<http::Response<()>> = vec![http::Response::default()];
let serialized =
http_serde_ext::response::vec::serialize(&responses, serde_json::value::Serializer)
.unwrap();
let mut deserialized: Vec<http::Response<()>> =
http_serde_ext::response::vec::deserialize(serialized).unwrap();
let original = responses.remove(0).into_parts();
let deserialized = deserialized.remove(0).into_parts();
assert_eq!(original.0.status, deserialized.0.status);
assert_eq!(original.0.version, deserialized.0.version);
assert_eq!(original.0.headers, deserialized.0.headers);
assert_eq!(original.1, deserialized.1);
Acknowledgements
This crate is heavily inspired by Kornel's http-serde.
Dependencies
~0.7–1.4MB
~28K SLoC