mirror of
https://github.com/CIMEngine/cimengine-build-tools.git
synced 2024-11-05 20:53:58 +03:00
feat: new country command
This commit is contained in:
parent
ff8e88b39b
commit
b1f5e42a46
7 changed files with 147 additions and 20 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
/target
|
||||
/map
|
27
Cargo.lock
generated
27
Cargo.lock
generated
|
@ -113,6 +113,7 @@ dependencies = [
|
|||
"geojson",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"toml",
|
||||
"toml_edit",
|
||||
"wax",
|
||||
]
|
||||
|
@ -491,6 +492,15 @@ dependencies = [
|
|||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_spanned"
|
||||
version = "0.6.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.13.2"
|
||||
|
@ -552,11 +562,26 @@ dependencies = [
|
|||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.8.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"toml_edit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.6.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_edit"
|
||||
|
@ -565,6 +590,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"winnow",
|
||||
]
|
||||
|
|
|
@ -11,6 +11,7 @@ geo = "0.28.0"
|
|||
geojson = "0.24.1"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
toml = "0.8.12"
|
||||
toml_edit = "0.22.12"
|
||||
wax = "0.6.0"
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ use clap::Parser;
|
|||
|
||||
mod build;
|
||||
mod init;
|
||||
mod new;
|
||||
mod types;
|
||||
|
||||
use types::Commands;
|
||||
|
@ -12,6 +13,7 @@ fn main() {
|
|||
match args.cmd {
|
||||
Commands::Build => build::build(),
|
||||
Commands::Init { name } => init::init(name),
|
||||
Commands::New { cmd } => new::new(cmd),
|
||||
_ => unimplemented!(),
|
||||
}
|
||||
}
|
||||
|
|
75
src/new.rs
Normal file
75
src/new.rs
Normal file
|
@ -0,0 +1,75 @@
|
|||
use std::{fs, path::Path};
|
||||
use toml_edit::{value, DocumentMut, Value};
|
||||
|
||||
use crate::types::{Config, Country, NewCommands};
|
||||
|
||||
pub fn new(cmd: NewCommands) {
|
||||
match cmd {
|
||||
NewCommands::Country {
|
||||
name,
|
||||
id,
|
||||
description,
|
||||
foundation_date,
|
||||
flag,
|
||||
about,
|
||||
} => {
|
||||
let name = name.unwrap_or_default();
|
||||
let description = description.unwrap_or_default();
|
||||
let foundation_date = foundation_date.unwrap_or_default();
|
||||
let flag = flag.unwrap_or_default();
|
||||
let about = about;
|
||||
|
||||
let country = Country {
|
||||
name: name.clone(),
|
||||
description,
|
||||
foundation_date,
|
||||
flag,
|
||||
about,
|
||||
tags: Some(vec![]),
|
||||
};
|
||||
|
||||
let config = fs::read_to_string("config.toml").unwrap();
|
||||
|
||||
// Validate config
|
||||
let c = toml::from_str::<Config>(&config);
|
||||
|
||||
match c {
|
||||
Ok(c) => c,
|
||||
Err(err) => {
|
||||
panic!("Invalid config: {}", err);
|
||||
}
|
||||
};
|
||||
|
||||
// Get actual config
|
||||
let mut config = config.parse::<DocumentMut>().unwrap();
|
||||
|
||||
// Add country to layers
|
||||
let layers = config["country"]["layers"].clone().into_value().unwrap();
|
||||
|
||||
let layers = if let Value::Array(mut layers) = layers {
|
||||
layers.push(&id);
|
||||
layers
|
||||
} else {
|
||||
panic!("layers is not an array");
|
||||
};
|
||||
|
||||
config["country"]["layers"] = value(layers);
|
||||
|
||||
fs::write("config.toml", config.to_string()).unwrap();
|
||||
|
||||
// Add country to countries
|
||||
let country_folder = Path::new(".").join("countries").join(&id);
|
||||
fs::create_dir_all(&country_folder).unwrap();
|
||||
fs::write(
|
||||
country_folder.join("country.toml"),
|
||||
toml::to_string_pretty(&country).unwrap(),
|
||||
)
|
||||
.unwrap();
|
||||
fs::write(
|
||||
country_folder.join("country.geojson"),
|
||||
include_str!("./templates/sample.geojson"),
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -10,22 +10,23 @@ geo_file = "geo.geojson"
|
|||
# generate_colors = false
|
||||
# show_markers = false
|
||||
|
||||
# Include or exclude countries based on tags
|
||||
# Glob syntax is supported
|
||||
[[processing.tags]]
|
||||
include = [] # [] = not filtered
|
||||
# exclude = ["test", "test2"]
|
||||
|
||||
# [[processing.countries_rewrite]]
|
||||
# name = "name"
|
||||
# color = "#000000"
|
||||
|
||||
# Information for public repository in cimengine. See: https://github.com/CIMEngine/MapList
|
||||
# [[processing.public]]
|
||||
# [processing.public]
|
||||
# name = "Sample Map"
|
||||
# geo = "https://example.com/geo.geojson"
|
||||
# countries = "https://example.com/countries.json"
|
||||
|
||||
# Include or exclude countries based on tags
|
||||
# Glob syntax is supported
|
||||
# [processing.tags]
|
||||
# include = [] # [] = not filtered
|
||||
# exclude = ["test", "test2"]
|
||||
|
||||
# [processing.countries_rewrite]
|
||||
# name = "name"
|
||||
# color = "#000000"
|
||||
|
||||
# Nature layers
|
||||
[[nature]]
|
||||
id = "water"
|
||||
color = "#75cff0"
|
||||
|
|
38
src/types.rs
38
src/types.rs
|
@ -35,7 +35,19 @@ pub enum Commands {
|
|||
#[derive(Debug, Subcommand)]
|
||||
pub enum NewCommands {
|
||||
/// Create new country
|
||||
Country { name: String },
|
||||
Country {
|
||||
id: String,
|
||||
#[clap(short, long)]
|
||||
name: Option<String>,
|
||||
#[clap(short, long)]
|
||||
description: Option<String>,
|
||||
#[clap(short, long)]
|
||||
foundation_date: Option<String>,
|
||||
#[clap(long)]
|
||||
flag: Option<String>,
|
||||
#[clap(short, long)]
|
||||
about: Option<String>,
|
||||
},
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||
|
@ -59,12 +71,13 @@ pub struct ProcessingConfig {
|
|||
|
||||
tags: Option<ProcessingTagsConfig>,
|
||||
countries_rewrite: Option<CountryRewriteConfig>,
|
||||
public: Option<PublicConfig>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||
pub struct ProcessingTagsConfig {
|
||||
include: Vec<String>,
|
||||
exclude: Vec<String>,
|
||||
include: Option<Vec<String>>,
|
||||
exclude: Option<Vec<String>>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||
|
@ -77,11 +90,18 @@ pub struct CountryRewriteConfig {
|
|||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||
pub struct Country {
|
||||
pub struct PublicConfig {
|
||||
name: String,
|
||||
description: String,
|
||||
foundation_date: String,
|
||||
flag: String,
|
||||
about: Option<String>,
|
||||
tags: Option<Vec<String>>,
|
||||
geo: String,
|
||||
countries: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||
pub struct Country {
|
||||
pub name: String,
|
||||
pub description: String,
|
||||
pub foundation_date: String,
|
||||
pub flag: String,
|
||||
pub about: Option<String>,
|
||||
pub tags: Option<Vec<String>>,
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue