pub mod aluminium;
pub mod battery;
pub mod construction;
pub mod detergent;
pub mod electronics;
pub mod furniture;
pub mod shared;
pub mod steel;
pub mod textile;
pub mod toy;
pub mod tyre;
pub mod unsold_goods;
pub use aluminium::AluminiumData;
pub use battery::{BatteryData, MaterialComposition};
pub use construction::ConstructionData;
pub use detergent::{DetergentData, SurfactantEntry};
pub use electronics::ElectronicsData;
pub use furniture::FurnitureData;
pub use shared::{CriticalRawMaterial, SvhcSubstance};
pub use steel::SteelData;
pub use textile::{FibreEntry, TextileData};
pub use toy::ToyData;
pub use tyre::TyreData;
pub use unsold_goods::{UnsoldGoodsDestination, UnsoldGoodsReason, UnsoldGoodsReport};
use serde::{Deserialize, Serialize};
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 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
}