use serde::{Deserialize, Serialize};
use super::aluminium::AluminiumData;
use super::battery::BatteryData;
use super::construction::ConstructionData;
use super::detergent::DetergentData;
use super::electronics::ElectronicsData;
use super::furniture::FurnitureData;
use super::steel::SteelData;
use super::textile::TextileData;
use super::toy::ToyData;
use super::tyre::TyreData;
use super::unsold_goods::UnsoldGoodsReport;
use crate::domain::sector::Sector;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "sector", rename_all = "camelCase")]
#[non_exhaustive]
pub enum SectorData {
Battery(BatteryData),
Textile(TextileData),
UnsoldGoods(UnsoldGoodsReport),
Steel(SteelData),
Electronics(ElectronicsData),
Construction(ConstructionData),
Tyre(TyreData),
Toy(ToyData),
Aluminium(AluminiumData),
Furniture(FurnitureData),
Detergent(DetergentData),
Other(serde_json::Value),
}
impl SectorData {
pub fn sector(&self) -> Sector {
match self {
SectorData::Battery(_) => Sector::Battery,
SectorData::Textile(_) => Sector::Textile,
SectorData::UnsoldGoods(_) => Sector::UnsoldGoods,
SectorData::Steel(_) => Sector::Steel,
SectorData::Electronics(_) => Sector::Electronics,
SectorData::Construction(_) => Sector::Construction,
SectorData::Tyre(_) => Sector::Tyre,
SectorData::Toy(_) => Sector::Toy,
SectorData::Aluminium(_) => Sector::Aluminium,
SectorData::Furniture(_) => Sector::Furniture,
SectorData::Detergent(_) => Sector::Detergent,
SectorData::Other(_) => Sector::Other,
}
}
pub fn gtin(&self) -> Option<&str> {
match self {
SectorData::Battery(d) => Some(d.gtin.as_str()),
SectorData::Textile(d) => Some(d.gtin.as_str()),
SectorData::Steel(d) => Some(d.gtin.as_str()),
SectorData::Electronics(d) => Some(d.gtin.as_str()),
SectorData::Construction(d) => Some(d.gtin.as_str()),
SectorData::Tyre(d) => Some(d.gtin.as_str()),
SectorData::Toy(d) => Some(d.gtin.as_str()),
SectorData::Aluminium(d) => Some(d.gtin.as_str()),
SectorData::Furniture(d) => Some(d.gtin.as_str()),
SectorData::Detergent(d) => Some(d.gtin.as_str()),
SectorData::UnsoldGoods(_) | SectorData::Other(_) => None,
}
}
}
pub fn redact_sector_data(
data: &SectorData,
viewer_tier: crate::domain::identity::AccessTier,
descriptor: &crate::catalog::SectorDescriptor,
) -> serde_json::Value {
let mut value = match serde_json::to_value(data) {
Ok(v) => v,
Err(_) => return serde_json::Value::Null,
};
if let Some(obj) = value.as_object_mut() {
obj.retain(|key, _| match descriptor.access_tiers.get(key) {
Some(&required) => viewer_tier >= required,
None => true,
});
}
value
}