diff --git a/src/build.rs b/src/build.rs index 65c5982..151cd61 100644 --- a/src/build.rs +++ b/src/build.rs @@ -1,12 +1,14 @@ use std::{fs, path::Path, time}; use serde_json::json; -use wax::{Glob, Pattern}; use crate::{ types::{CountryData, ToCollection}, - utils::{diff_countries, get_country, read_config}, + utils::{ + diff_countries, get_country, is_match, read_config, rewrite_if_some, rewrite_if_some_option, + }, }; +use wax::Glob; pub fn build() { let config = read_config(); @@ -28,50 +30,55 @@ pub fn build() { { let dissolved_time = time::Instant::now(); - if tags.len() == 0 { - for country_id in &config.main.layers { - countries.push(get_country(country_id.to_owned())); - } - } else { - for country_id in &config.main.layers { - let country = get_country(country_id.to_owned()); + for country_id in &config.main.layers { + let country = get_country(country_id.to_owned()); - match &country.config.tags { - Some(tags) => { - let mut matches = false; - for glob in &globs { - for tag in tags { - if glob.is_match(tag.as_str()) { - matches = true; - } - } - } - - if !matches { - continue; - } - - countries.push(country); - } - None => { - continue; - } - } + if is_match(&country.config.tags, &globs) { + countries.push(country); } } println!("Dissolved in {:?}", dissolved_time.elapsed()); } - // TODO: Add country_rewrite support - - let countries = { + let countries: Vec = { let diff_time = time::Instant::now(); - let countries = diff_countries(countries); + let mut countries = diff_countries(countries); println!("Diffed in {:?}", diff_time.elapsed()); + countries.iter_mut().for_each(|c| { + if !processing_item.show_markers.unwrap_or(true) { + c.markers = vec![]; + } + + for country_rewrite in processing_item.countries_rewrite.clone().unwrap_or(vec![]) { + let tags = country_rewrite.tags.unwrap_or(vec![]); + let globs: Vec = tags.iter().map(|tag| Glob::new(tag).unwrap()).collect(); + + if is_match(&c.config.tags, &globs) { + rewrite_if_some(country_rewrite.properties.name, &mut c.config.name); + rewrite_if_some( + country_rewrite.properties.description, + &mut c.config.description, + ); + rewrite_if_some( + country_rewrite.properties.foundation_date, + &mut c.config.foundation_date, + ); + rewrite_if_some(country_rewrite.properties.flag, &mut c.config.flag); + rewrite_if_some_option( + country_rewrite.properties.about, + &mut c.config.about, + ); + rewrite_if_some(country_rewrite.properties.fill, &mut c.config.fill); + rewrite_if_some(country_rewrite.properties.stroke, &mut c.config.stroke); + rewrite_if_some_option(country_rewrite.properties.tags, &mut c.config.tags); + } + } + }); + countries }; diff --git a/src/templates/config.toml b/src/templates/config.toml index 2916eb0..07f3f39 100644 --- a/src/templates/config.toml +++ b/src/templates/config.toml @@ -20,8 +20,10 @@ output_folder = "./out/map" # Glob syntax is supported # tags = ["test-[!2]"] -# Rewrite properties of all countries. All fields are optional. -# [processing.countries_rewrite] +# Rewrite properties of countries by tags. All fields except `tags` are optional. +# [[processing.countries_rewrite]] +# tags = ["test"] +# [processing.countries_rewrite.properties] # name = "name" # color = "#000000" # description = "description" @@ -29,7 +31,7 @@ output_folder = "./out/map" # flag = "https://example.com/flag.png" # about = "https://example.com/about.html" -# Nature layers +# Additional nature layers [[nature]] id = "water" color = "#75cff0" diff --git a/src/types.rs b/src/types.rs index c938797..43e9314 100644 --- a/src/types.rs +++ b/src/types.rs @@ -75,17 +75,26 @@ pub struct ProcessingConfig { pub output_folder: String, pub tags: Option>, - pub countries_rewrite: Option, + pub countries_rewrite: Option>, pub public: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct CountryRewriteConfig { + pub tags: Option>, + pub properties: CountryRewriteConfigProps, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct CountryRewriteConfigProps { pub name: Option, pub description: Option, pub foundation_date: Option, pub flag: Option, + pub fill: Option, + pub stroke: Option, pub about: Option, + pub tags: Option>, } #[derive(Debug, Serialize, Deserialize, Clone)] diff --git a/src/utils.rs b/src/utils.rs index 661637f..780f7cb 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -2,6 +2,7 @@ use std::{fs, path::Path}; use geo::{BooleanOps, MultiPolygon}; use geojson::GeoJson; +use wax::{Glob, Pattern}; use crate::types::{Config, CountryConfig, CountryData, Territory, ToMultiPolygon, ToSplitGeo}; @@ -77,3 +78,43 @@ pub fn hash_hex_color(s: String) -> String { format!("#{}", hex_str.chars().take(6).collect::()) } + +pub fn is_match(tags: &Option>, globs: &Vec) -> bool { + if globs.len() == 0 { + return true; + } + + match tags { + Some(tags) => { + let mut matches = false; + for glob in globs { + for tag in tags { + if glob.is_match(tag.as_str()) { + matches = true; + } + } + } + + matches + } + None => true, + } +} + +pub fn rewrite_if_some(value: Option, rewrite: &mut T) { + match value { + Some(value) => { + *rewrite = value; + } + None => {} + } +} + +pub fn rewrite_if_some_option(value: Option, rewrite: &mut Option) { + match value { + Some(value) => { + *rewrite = Some(value); + } + None => {} + } +}