[librsvg: 6/23] Start sketching out an Accept-Language parser




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]