use diesel::pg::PgConnection;
use diesel::prelude::*;
use std::error::Error;
use geojson::GeoJson;
use crate::pg_pool::Pool;
use crate::sql_functions::*;
pub fn load_geo_data(pool: &Pool, geojson_str: &String) -> Result<(), Box<dyn Error>> {
match geojson_str.parse::<GeoJson>().unwrap() {
GeoJson::FeatureCollection(feat_col) => {
(for feature in feat_col.features {
let pool = pool.clone();
let conn = pool.get().unwrap();
let property = feature.properties.unwrap();
let title = property.get("nhood").unwrap().to_string();
let trimmed_title = title.split('"').collect::<Vec<&str>>()[1];
let geo_level = 1;
let geojson = feature.geometry.unwrap();
create(&conn, trimmed_title, geo_level, GeoJson::from(geojson))?;
})
}
_ => (),
}
Ok(())
}
pub fn create<'a>(
conn: &PgConnection,
tle: &'a str,
geo_lvl: i32,
geo_json: GeoJson,
) -> Result<(), Box<dyn Error>> {
use crate::schema::fences::dsl::*;
use diesel::dsl::insert_into;
insert_into(fences)
.values((
title.eq(tle),
geo_level.eq(geo_lvl),
geo.eq(ST_GeomFromGeoJSON(geo_json.to_string())),
))
.execute(conn)?;
Ok(())
}