From fc94e5ba8b2fb8d894b9bc162ada3a04b508fec3 Mon Sep 17 00:00:00 2001 From: Ralf Zerres Date: Mon, 29 Jun 2020 01:15:41 +0200 Subject: [PATCH] advotracker: services substructure Signed-off-by: Ralf Zerres --- .../src/services/import/allianzdirectcall.rs | 119 ++++++++++++++++++ advotracker/src/services/import/csv.rs | 23 ++++ advotracker/src/services/import/mod.rs | 9 ++ .../services/locales/allianzdirectcall.json | 37 ++++++ advotracker/src/services/mod.rs | 9 ++ 5 files changed, 197 insertions(+) create mode 100644 advotracker/src/services/import/allianzdirectcall.rs create mode 100644 advotracker/src/services/import/csv.rs create mode 100644 advotracker/src/services/import/mod.rs create mode 100644 advotracker/src/services/locales/allianzdirectcall.json create mode 100644 advotracker/src/services/mod.rs diff --git a/advotracker/src/services/import/allianzdirectcall.rs b/advotracker/src/services/import/allianzdirectcall.rs new file mode 100644 index 0000000..f08c40e --- /dev/null +++ b/advotracker/src/services/import/allianzdirectcall.rs @@ -0,0 +1,119 @@ +/* + * advotracker - Hotline tackingtool for Advocats + * + * Copyright 2020 Ralf Zerres + * SPDX-License-Identifier: (0BSD or MIT) + */ + +use chrono::{Local, DateTime}; +use locales::t; +use std::error::Error; +use tracing::trace; + +//use crate::db::redis; +use crate::data; + +/// export as csv format +/// https://docs.rs/csv/1.1.3/csv/cookbook/index.html +/// https://blog.burntsushi.net/csv/ +pub fn export(p: &mut String, lang: &String) -> Result<(), Box> { + use std::fs::File; + use std::path::Path; + //use std::ffi::OsStr; + + let mut res = t!("csv.export.started", lang); + let mut state = t!("state.started", lang); + trace!(target: "advotrackerd", process = ?res, state = ?state); + + // Note: slash syntax also works on Windows! + let path = Path::new(p); + + // open the file + let file = File::open(path)?; + + trace!(target: "csv.export", extension = ?path.extension(), file = ?file); + state = t!("state.finished", lang); + res = t!("csv.export.finished", lang); + trace!(target: "csv-export", process = ?res, state = ?state); + + Ok(()) +} + +/// import AllianzDirectCall data from a csv delimeted file +/// save records to redis backend +/// https://docs.rs/csv/1.1.3/csv/cookbook/index.html +/// https://blog.burntsushi.net/csv/ +pub fn import(p: &mut String, lang: &String) -> Result> { + use std::fs::File; + use std::path::Path; + use std::ffi::OsStr; + + let mut res = t!("csv.import.started", lang); + let mut state = t!("state.started", lang); + let dt_start: DateTime = Local::now(); + + trace!(target: "advotrackerd", process = ?res, state = ?state, date_start = ?dt_start.to_string()); + + // Note: slash syntax also workd on Windows! + let path = Path::new(p); + + // must be a readable file + trace!(target: "advotrackerd", path = ?path); + assert_eq!(path.is_file(), true); + + // only accept files with '.txt' extensions + let extension = path.extension(); + assert_eq!(extension, Some(OsStr::new("txt"))); + + // open the file + let file = File::open(path)?; + trace!(target: "advotrackerd", extension = ?extension, file = ?file); + + // Build the CSV reader and iterate over each record. + let mut csv_reader = csv::ReaderBuilder::new() + .has_headers(true) + .delimiter(b' ') + //.comment(Some(b'#')) + //.flexible(true) + .from_reader(file); + { + // We nest this call in its own scope because of lifetimes. + let headers = csv_reader.headers()?; + trace!(target: "advotrackerd", header = ?headers); + } + + //for result in csv_reader.records() { + let mut count = 0; + for result in csv_reader.deserialize() { + // The iterator yields Result, so we check the + // error here. + //let record = result?; + let _record: data::AllianzPolicyNumber = result?; + //println!("{:?}", record); + + // WIP: write to redis backend + // policy_data.push(PolicyData { + // date_inserted: Some(Utc::now().naive_utc()), + // dion: 1, + // policy_code: PolicyCode::AS, + // policy_number, + // status: Status::Active, + // }); + + count +=1; + } + + let dt_end: DateTime = Local::now(); + let duration = dt_end.signed_duration_since(dt_start); + println!("Duration: {:#?}", duration); + //let seconds = duration.secs; + //println!("Seconds: {:#?}", seconds); + trace!(target: "advotrackerd", record_count = ?count, duration = ?duration); + + state = t!("state.finished", lang); + res = t!("csv.import.finished", lang); + trace!(target: "advotrackerd", process = ?res, state = ?state, date_stop = ?dt_end.to_string()); + + //Ok(count, duration.seconds()) + Ok(count) +} diff --git a/advotracker/src/services/import/csv.rs b/advotracker/src/services/import/csv.rs new file mode 100644 index 0000000..0e26274 --- /dev/null +++ b/advotracker/src/services/import/csv.rs @@ -0,0 +1,23 @@ +use std::error::Error; +use std::io; +use std::process; + +/// import from csv format (Standard in) +fn import() -> Result<(), Box> { + // Build the CSV reader and iterate over each record. + let mut csv_reader = csv::Reader::from_reader(io::stdin()); + for result in csv_reader.records() { + // The iterator yields Result, so we check the + // error here. + let record = result?; + println!("{:?}", record); + } + Ok(()) +} + +fn main() { + if let Err(err) = import() { + println!("error running example: {}", err); + process::exit(1); + } +} diff --git a/advotracker/src/services/import/mod.rs b/advotracker/src/services/import/mod.rs new file mode 100644 index 0000000..4a07d2d --- /dev/null +++ b/advotracker/src/services/import/mod.rs @@ -0,0 +1,9 @@ +/* + * advotracker - Hotline tackingtool for Advocats + * + * Copyright 2020 Ralf Zerres + * SPDX-License-Identifier: (0BSD or MIT) + */ + +/// Alliand DirecCall module +pub mod allianzdirectcall; diff --git a/advotracker/src/services/locales/allianzdirectcall.json b/advotracker/src/services/locales/allianzdirectcall.json new file mode 100644 index 0000000..d271571 --- /dev/null +++ b/advotracker/src/services/locales/allianzdirectcall.json @@ -0,0 +1,37 @@ +{ + "err.lang.not_found": { + "de_DE.UTF-8": "Konnte die Umgebungsvarialbe LANG nicht auslesen", + "de": "Konnte die Umgebungsvarialbe LANG nicht auslesen", + "en": "Couldn't read LANG" + }, + "csv_import.started": { + "de_DE.UTF-8": "importieren von einer csv-datei gestartet", + "de": "importieren von einer csv-datei gestartet", + "en": "import from a csv-file started" + }, + "csv_import.finished": { + "de_DE.UTF-8": "importieren von einer csv-datei beendet", + "de": "importieren von einer csv-datei beendet", + "en": "import from a csv-file finished" + }, + "csv_export.started": { + "de_DE.UTF-8": "exportieren in eine csv-datei gestartet", + "de": "exportieren in eine csv-datei gestartet", + "en": "export to csv-file started" + }, + "csv_export.finished": { + "de_DE.UTF-8": "exportieren in eine csv-datei beendet", + "de": "exportieren in eine csv-datei beendet", + "en": "export to csv-file finished" + }, + "state.started": { + "de_DE.UTF-8": "gestartet", + "de": "gestartet", + "en": "started" + }, + "state.finished": { + "de_DE.UTF-8": "beendet", + "de": "beended", + "en": "finished" + } +} diff --git a/advotracker/src/services/mod.rs b/advotracker/src/services/mod.rs new file mode 100644 index 0000000..4fa0e5e --- /dev/null +++ b/advotracker/src/services/mod.rs @@ -0,0 +1,9 @@ +/* + * advotracker - Hotline tackingtool for Advocats + * + * Copyright 2020 Ralf Zerres + * SPDX-License-Identifier: (0BSD or MIT) + */ + +/// advotracker import modules +pub mod import;