[librsvg: 6/23] Start sketching out an Accept-Language parser
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 6/23] Start sketching out an Accept-Language parser
- Date: Mon, 24 May 2021 17:47:30 +0000 (UTC)
commit 88823426f8edf79674dd164f409dce13b6fd9b11
Author: Federico Mena Quintero <federico gnome org>
Date: Tue May 18 20:18:35 2021 -0500
Start sketching out an Accept-Language parser
Makefile.am | 1 +
src/accept_language.rs | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/lib.rs | 1 +
3 files changed, 68 insertions(+)
---
diff --git a/Makefile.am b/Makefile.am
index c404ca86..0d1e5b7d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -28,6 +28,7 @@ librsvg_@RSVG_API_MAJOR_VERSION@_la_SOURCES = \
LIBRSVG_SRC = \
Cargo.toml \
build.rs \
+ src/accept_language.rs \
src/angle.rs \
src/api.rs \
src/aspect_ratio.rs \
diff --git a/src/accept_language.rs b/src/accept_language.rs
new file mode 100644
index 00000000..c5310e97
--- /dev/null
+++ b/src/accept_language.rs
@@ -0,0 +1,66 @@
+//! Parser for an Accept-Language HTTP header.
+
+use language_tags::LanguageTag;
+
+struct Weight(Option<f32>);
+
+impl Weight {
+ fn numeric(&self) -> f32 {
+ self.0.unwrap_or(1.0)
+ }
+}
+
+struct Item {
+ tag: LanguageTag,
+ weight: Weight,
+}
+
+/// Stores a parsed version of an HTTP Accept-Language header.
+///
+/// https://datatracker.ietf.org/doc/html/rfc7231#section-5.3.5
+pub struct AcceptLanguage(Box<[Item]>);
+
+/// Errors when parsing an `AcceptLanguage`.
+#[derive(Debug, PartialEq)]
+pub enum Error {
+ NoElements,
+}
+
+impl AcceptLanguage {
+ pub fn parse(s: &str) -> Result<AcceptLanguage, Error> {
+ let mut items = Vec::new();
+
+ for val in s.split(',') {
+
+ }
+
+ if items.len() == 0 {
+ Err(Error::NoElements)
+ } else {
+ Ok(AcceptLanguage(items.into_boxed_slice()))
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn empty_lists_yield_error() {
+ assert!(matches!(
+ AcceptLanguage::parse(""),
+ Err(Error::NoElements)
+ ));
+
+ assert!(matches!(
+ AcceptLanguage::parse(","),
+ Err(Error::NoElements)
+ ));
+
+ assert!(matches!(
+ AcceptLanguage::parse(", , ,,,"),
+ Err(Error::NoElements)
+ ));
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
index 1c6f5633..3ec03ed0 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -180,6 +180,7 @@ mod property_macros;
#[macro_use]
mod util;
+mod accept_language;
mod angle;
mod api;
mod aspect_ratio;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]