use crate::models::dataset_extra_fields::DatasetExtraFields;
use crate::models::{Creator, Thumbnail};
use edc_connector_client::types::asset::Asset;
use edc_connector_client::types::catalog::Dataset;
use edc_connector_client::types::data_address::DataAddress;
use edc_connector_client::types::properties::Properties;
#[derive(Clone, Debug, PartialEq)]
pub struct AssetItem {
pub id: String,
pub name: String,
pub version: Option<semver::Version>,
pub description: Option<String>,
pub creator: Option<Creator>,
pub thumbnail: Option<Thumbnail>,
pub keywords: Vec<String>,
pub base_url: String,
pub proxy_path: bool,
pub proxy_query_params: bool,
pub proxy_method: bool,
pub proxy_body: bool,
}
impl From<Asset> for AssetItem {
fn from(asset: Asset) -> Self {
let id = asset.id().to_string();
let name = get_property(asset.properties(), "name");
let description = asset
.properties()
.get::<String>("http://www.w3.org/2000/01/rdf-schema#comment")
.unwrap_or_default();
let version = asset
.properties()
.get::<String>("http://www.w3.org/ns/dcat#version")
.unwrap_or_default()
.and_then(|version| semver::Version::parse(version.as_str()).ok());
let creator = asset
.properties()
.get_raw("http://purl.org/dc/terms/creator")
.and_then(|property_value| serde_json::from_value::<Creator>(property_value.0.clone()).ok());
let thumbnail = asset
.properties()
.get_raw("http://xmlns.com/foaf/0.1/thumbnail")
.and_then(|property_value| {
serde_json::from_value::<Thumbnail>(property_value.0.clone()).ok()
});
let keywords = asset
.properties()
.get_raw("http://www.w3.org/ns/dcat#keyword")
.and_then(|property_value| {
serde_json::from_value::<Vec<String>>(property_value.0.clone()).ok()
})
.unwrap_or_default();
let base_url = asset
.data_address()
.property("baseUrl")
.unwrap_or_default()
.unwrap_or_default();
let proxy_path = get_boolean_property(asset.data_address(), "proxyPath");
let proxy_query_params = get_boolean_property(asset.data_address(), "proxyQueryParams");
let proxy_method = get_boolean_property(asset.data_address(), "proxyMethod");
let proxy_body = get_boolean_property(asset.data_address(), "proxyBody");
AssetItem {
id,
name,
version,
description,
creator,
thumbnail,
keywords,
base_url,
proxy_path,
proxy_query_params,
proxy_method,
proxy_body,
}
}
}
impl From<edc_federated_catalog_client::models::Dataset> for AssetItem {
fn from(dataset: edc_federated_catalog_client::models::Dataset) -> Self {
Self {
id: dataset.id.clone(),
name: dataset.name,
version: dataset
.version
.and_then(|version| semver::Version::parse(&version).ok()),
description: dataset.description,
creator: dataset.creator.map(|creator| Creator {
name: Some(creator.name),
thumbnail: Some(Thumbnail {
resource: Some(creator.thumbnail.resource),
}),
}),
thumbnail: dataset.thumbnail.map(|thumbnail| Thumbnail {
resource: Some(thumbnail.resource),
}),
keywords: dataset.keywords,
base_url: "".to_string(),
proxy_path: false,
proxy_query_params: false,
proxy_method: false,
proxy_body: false,
}
}
}
impl From<&Dataset<DatasetExtraFields>> for AssetItem {
fn from(dataset: &Dataset<DatasetExtraFields>) -> Self {
let id = dataset.id().to_string();
let extra = &dataset.extra;
Self {
id,
name: extra.name.clone(),
version: extra
.version
.as_ref()
.and_then(|version| semver::Version::parse(version).ok()),
description: extra.description.to_owned(),
creator: extra.creator.as_ref().map(|creator| Creator {
name: Some(creator.name.to_owned()),
thumbnail: Some(Thumbnail {
resource: Some(creator.thumbnail.resource.to_owned()),
}),
}),
thumbnail: extra.thumbnail.as_ref().map(|thumbnail| Thumbnail {
resource: Some(thumbnail.resource.to_owned()),
}),
keywords: extra.keywords.clone(),
base_url: "".to_string(),
proxy_path: false,
proxy_query_params: false,
proxy_method: false,
proxy_body: false,
}
}
}
fn get_property(properties: &Properties, name: &str) -> String {
properties
.get::<String>(name)
.unwrap_or_default()
.unwrap_or_default()
}
fn get_boolean_property(data_address: &DataAddress, name: &str) -> bool {
data_address
.property::<String>(name)
.unwrap_or_default()
.unwrap_or_default()
== "true"
}