use std::collections::HashMap;
use crate::utils::Cmp;
use anyhow::Result;
use stac::{Asset, ItemCollection};
use std::iter::FromIterator;
pub fn filter_assets_by_key(
assets: HashMap<String, Asset>,
patterns: &[&str],
) -> HashMap<String, Asset> {
let mut res: HashMap<String, Asset> = HashMap::new();
for pattern in patterns {
let pattern = pattern.trim();
let starts_with = pattern.ends_with('*');
let ends_with = pattern.starts_with('*');
let trimmed_pattern = pattern.trim_matches('*');
for (k, v) in assets.iter() {
let is_match = match (starts_with, ends_with) {
(true, false) => k.starts_with(trimmed_pattern),
(false, true) => k.ends_with(trimmed_pattern),
(true, true) => k.contains(trimmed_pattern),
(false, false) => k == trimmed_pattern,
};
if is_match {
res.insert(k.clone(), v.clone());
}
}
}
res
}
pub fn filter_tile(
items: ItemCollection,
field_name: &str,
values: &Vec<String>,
) -> Result<ItemCollection> {
let mut filtered_items = Vec::new();
for item in items.items {
let item_value = item.properties.additional_fields[field_name]
.as_str()
.unwrap();
for value in values {
if item_value == value.to_uppercase() {
filtered_items.push(item.clone())
}
}
}
let result = ItemCollection::from_iter(filtered_items);
Ok(result)
}
pub fn filter_tile_pc(items: ItemCollection, values: &Vec<&str>) -> Result<ItemCollection> {
let mut filtered_items = Vec::new();
for item in items.items {
let path = item.properties.additional_fields["landsat:wrs_path"]
.as_str()
.unwrap();
let row = item.properties.additional_fields["landsat:wrs_row"]
.as_str()
.unwrap();
let pr = ["p", path, "r", row].concat();
for value in values {
if &pr == value {
filtered_items.push(item.clone());
}
}
}
let result = ItemCollection::from_iter(filtered_items);
Ok(result)
}
pub fn filter_items<T>(
items: ItemCollection,
field_name: &str,
cmp: Cmp,
value: T,
) -> Result<ItemCollection>
where
T: std::convert::From<f64> + std::cmp::PartialOrd,
{
let mut filtered_items = Vec::new();
for item in items.items {
let item_value: T = item.properties.additional_fields[field_name]
.as_f64()
.unwrap()
.into();
match cmp {
Cmp::Less => {
if item_value < value {
filtered_items.push(item)
}
}
Cmp::Greater => {
if item_value > value {
filtered_items.push(item)
}
}
Cmp::LessEqual => {
if item_value <= value {
filtered_items.push(item)
}
}
Cmp::GreaterEqual => {
if item_value >= value {
filtered_items.push(item)
}
}
Cmp::Equal => {
if item_value == value {
filtered_items.push(item)
}
}
}
}
let result = ItemCollection::from_iter(filtered_items);
Ok(result)
}