Pārlūkot izejas kodu

[Receipt] Add support for date

Signed-off-by: Slava Barinov <rayslava@gmail.com>
Slava Barinov 5 gadi atpakaļ
vecāks
revīzija
2274649820
3 mainītis faili ar 134 papildinājumiem un 5 dzēšanām
  1. 92 0
      Cargo.lock
  2. 3 1
      Cargo.toml
  3. 39 4
      src/receipt.rs

+ 92 - 0
Cargo.lock

@@ -1,11 +1,55 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
+[[package]]
+name = "autocfg"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+
+[[package]]
+name = "chrono"
+version = "0.4.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
+dependencies = [
+ "libc",
+ "num-integer",
+ "num-traits",
+ "time",
+ "winapi",
+]
+
 [[package]]
 name = "itoa"
 version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
 
+[[package]]
+name = "libc"
+version = "0.2.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb"
+
+[[package]]
+name = "num-integer"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
+dependencies = [
+ "autocfg",
+]
+
 [[package]]
 name = "proc-macro2"
 version = "1.0.24"
@@ -15,6 +59,13 @@ dependencies = [
  "unicode-xid",
 ]
 
+[[package]]
+name = "qif_generator"
+version = "0.1.2"
+dependencies = [
+ "chrono",
+]
+
 [[package]]
 name = "quote"
 version = "1.0.8"
@@ -28,6 +79,8 @@ dependencies = [
 name = "receqif"
 version = "0.1.0"
 dependencies = [
+ "chrono",
+ "qif_generator",
  "serde",
  "serde_json",
 ]
@@ -80,8 +133,47 @@ dependencies = [
  "unicode-xid",
 ]
 
+[[package]]
+name = "time"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
+dependencies = [
+ "libc",
+ "wasi",
+ "winapi",
+]
+
 [[package]]
 name = "unicode-xid"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

+ 3 - 1
Cargo.toml

@@ -8,4 +8,6 @@ edition = "2018"
 
 [dependencies]
 serde = { version = "1.0", features = ["derive"] }
-serde_json = "1.0"
+serde_json = "1.0"
+qif_generator = "0.1.0"
+chrono = "0.4"

+ 39 - 4
src/receipt.rs

@@ -1,7 +1,8 @@
+use chrono::{Date, Utc};
 use serde::Deserialize;
 use std::fmt;
 
-#[derive(Deserialize)]
+#[derive(Deserialize, Debug)]
 pub struct Item {
     pub name: String,
     pub sum: i64,
@@ -15,12 +16,37 @@ impl fmt::Display for Item {
 
 #[allow(dead_code)]
 #[allow(non_snake_case)]
-#[derive(Deserialize)]
+#[derive(Deserialize, Debug)]
 struct Receipt {
     totalSum: i64,
+    #[serde(with = "custom_date_format")]
+    dateTime: Date<Utc>,
     items: Vec<Item>,
 }
 
+mod custom_date_format {
+    use chrono::{Date, TimeZone, Utc};
+    use serde::{self, Deserialize, Deserializer};
+
+    /// The format seems alike to RFC3339 but is not compliant
+    const FORMAT: &str = "%Y-%m-%dT%H:%M:%S";
+
+    /// Custom deserializer for format in our json
+    pub fn deserialize<'de, D>(deserializer: D) -> Result<Date<Utc>, D::Error>
+    where
+        D: Deserializer<'de>,
+    {
+        let s = String::deserialize(deserializer)?;
+        let dt = Utc
+            .datetime_from_str(&s, FORMAT)
+            .map_err(serde::de::Error::custom);
+        match dt {
+            Ok(date) => Ok(date.date()),
+            Err(e) => Err(e),
+        }
+    }
+}
+
 #[allow(dead_code)]
 #[derive(Deserialize)]
 struct Document {
@@ -41,6 +67,7 @@ pub fn parse_receipt(line: &str) -> Vec<Item> {
 #[cfg(test)]
 mod receipt {
     use super::*;
+    use chrono::Datelike;
 
     #[test]
     fn item() {
@@ -90,7 +117,8 @@ mod receipt {
 	    "name" : "СОУС ОСТР.380Г КИНТО",
 	    "sum" : 20599
         }
-    ]
+    ],
+    "dateTime" : "2020-06-19T17:12:00"
 }
 "#,
         );
@@ -100,6 +128,9 @@ mod receipt {
         assert_eq!(testit.items.len(), 2);
         assert_eq!(testit.items[0].sum, 5549);
         assert_eq!(testit.items[1].sum, 20599);
+        assert_eq!(testit.dateTime.day(), 19);
+        assert_eq!(testit.dateTime.month(), 6);
+        assert_eq!(testit.dateTime.year(), 2020);
     }
 
     #[test]
@@ -131,7 +162,8 @@ mod receipt {
           "name" : "СОУС ОСТР.380Г КИНТО",
           "sum" : 20599
         }
-      ]
+      ],
+    "dateTime" : "2020-06-19T17:12:00"
     }
   }
 }
@@ -143,6 +175,9 @@ mod receipt {
         assert_eq!(testit.document.receipt.items.len(), 2);
         assert_eq!(testit.document.receipt.items[0].sum, 5549);
         assert_eq!(testit.document.receipt.items[1].sum, 20599);
+        assert_eq!(testit.document.receipt.dateTime.day(), 19);
+        assert_eq!(testit.document.receipt.dateTime.month(), 6);
+        assert_eq!(testit.document.receipt.dateTime.year(), 2020);
     }
 
     #[test]