summaryrefslogtreecommitdiff
path: root/src/importer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/importer.rs')
-rw-r--r--src/importer.rs52
1 files changed, 51 insertions, 1 deletions
diff --git a/src/importer.rs b/src/importer.rs
index b1c1b18..c831ca9 100644
--- a/src/importer.rs
+++ b/src/importer.rs
@@ -10,6 +10,7 @@ use std::time::Duration;
use std::time::Instant;
use threadpool::ThreadPool;
use serde_json::to_value;
+use serde_json::Value;
use crate::diesel::Connection;
use crate::db;
@@ -119,7 +120,7 @@ impl<StravaApi: strava::StravaApi> Importer<StravaApi> {
*running = true;
pool.execute({
let shared = self.shared.clone();
- move || run_periodically(shared, Duration::from_secs(10))
+ move || run_periodically(shared, Duration::from_secs(5))
});
}
}
@@ -130,6 +131,44 @@ impl<StravaApi: strava::StravaApi> Importer<StravaApi> {
}
}
+fn to_run(data: &Value) -> Result<Value, Error> {
+ info!("to_run");
+ macro_rules! get {
+ ($id:ident str $e:expr) => {
+ $id[$e].as_str().ok_or_else(
+ || Error::UnexpectedJson($id.clone()))
+ };
+
+ ($id:ident f64 $e:expr) => {
+ $id[$e].as_f64().ok_or_else(
+ || Error::UnexpectedJson($id.clone()))
+ };
+ };
+
+ Ok(json!({
+ "type": "run",
+ "distance": get!(data f64 "distance")?,
+ "elapsed_time": get!(data f64 "elapsed_time")?,
+ }))
+}
+
+fn process_strava_activity<S: strava::StravaApi>(
+ shared: Arc<ImporterSharedData<S>>,
+ data: models::RawData) -> Result<Value, Error> {
+
+ let json_error = || Error::UnexpectedJson(data.payload.clone());
+ let dtype = data.payload["type"].as_str().ok_or_else(json_error)?;
+
+ let payload = match dtype {
+ "Run" => {
+ to_run(&data.payload)?
+ },
+ &_ => Err(Error::InternalError)?,
+ };
+
+ Ok(payload)
+}
+
fn process_raw_data<S: strava::StravaApi>(
shared: Arc<ImporterSharedData<S>>,
key: &models::RawDataKey,
@@ -138,7 +177,18 @@ fn process_raw_data<S: strava::StravaApi>(
let data = db::get_raw_data(&shared.conn.lock().unwrap(), key)?;
println!("Process raw data: {:#?}", data);
+ let payload = match data.data_type {
+ models::DataType::StravaActivity => {
+ process_strava_activity(shared.clone(), data)?
+ }
+ };
+
+ info!("Process finished. Payload: {:#?}", payload);
unimplemented!();
+
+ task.state = models::TaskState::SUCCESSFUL;
+ db::update_task(&shared.conn.lock().unwrap(), task)?;
+ Ok(())
}
fn process_all_raw_data<S: strava::StravaApi>(