use std::fmt::{Display, Formatter};
use std::str::FromStr;
use serde::Serialize;
use thiserror::Error;
use crate::from_str_deserialize_impl;
use crate::modules::materials::MaterialCategory;
#[derive(Debug, Serialize, Clone, PartialEq, Eq, Hash)]
pub enum Material {
Antimony,
Arsenic,
Boron,
Cadmium,
Carbon,
Chromium,
Germanium,
Iron,
Lead,
Manganese,
Mercury,
Molybdenum,
Nickel,
Niobium,
Phosphorus,
Polonium,
Rhenium,
Ruthenium,
Selenium,
Sulphur,
Technetium,
Tellurium,
Tin,
Tungsten,
Vanadium,
Yttrium,
Zinc,
Zirconium,
BasicConductors,
BioMechanicalConduits,
BiotechConductors,
CausticCrystal,
CausticShard,
ChemicalDistillery,
ChemicalManipulators,
ChemicalProcessors,
ChemicalStorageUnits,
CompactComposites,
CompoundShielding,
ConductiveCeramics,
ConductiveComponents,
ConductivePolymers,
ConfigurableComponents,
CoreDynamicsComposites,
CorrosiveMechanisms,
CrystalShards,
ElectrochemicalArrays,
ExquisiteFocusCrystals,
FilamentComposites,
FlawedFocusCrystals,
FocusCrystals,
GalvanisingAlloys,
GridResistors,
GuardianPowerCell,
GuardianPowerConduit,
GuardianSentinelWeaponParts,
GuardianTechnologyComponent,
GuardianWreckageComponents,
HardenedSurfaceFragments,
HeatConductionWiring,
HeatDispersionPlate,
HeatExchangers,
HeatExposureSpecimen,
HeatResistantCeramics,
HeatVanes,
HighDensityComposites,
HybridCapacitors,
ImperialShielding,
ImprovisedComponents,
MechanicalComponents,
MechanicalEquipment,
MechanicalScrap,
MilitaryGradeAlloys,
MilitarySupercapacitors,
PharmaceuticalIsolators,
PhaseAlloys,
PhasingMembraneResidue,
PolymerCapacitors,
PrecipitatedAlloys,
ProprietaryComposites,
PropulsionElements,
ProtoHeatRadiators,
ProtoLightAlloys,
ProtoRadiolicAlloys,
RefinedFocusCrystals,
SalvagedAlloys,
SensorFragment,
ShieldEmitters,
ShieldingSensors,
TacticalCoreChip,
TemperedAlloys,
ThargoidCarapace,
ThargoidEnergyCell,
ThargoidOrganicCircuitry,
ThargoidTechnologicalComponents,
ThermicAlloys,
WeaponParts,
WornShieldEmitters,
WreckageComponents,
AberrantShieldPatternAnalysis,
AbnormalCompactEmissionData,
AdaptiveEncryptorsCapture,
AnomalousBulkScanData,
AnomalousFSDTelemetry,
AtypicalDisruptedWakeEchoes,
AtypicalEncryptionArchives,
ClassifiedScanDatabanks,
ClassifiedScanFragment,
CrackedIndustrialFirmware,
DataminedWakeExceptions,
DecodedEmissionData,
DistortedShieldCycleRecordings,
DivergentScanData,
EccentricHyperspaceTrajectories,
ExceptionScrambledEmissionData,
GuardianModuleBlueprintFragment,
GuardianVesselBlueprintFragment,
GuardianWeaponBlueprintFragment,
InconsistentShieldSoakAnalysis,
IrregularEmissionData,
MassiveEnergySurgeAnalytics,
ModifiedConsumerFirmware,
ModifiedEmbeddedFirmware,
OpenSymmetricKeys,
PatternAlphaObeliskData,
PatternBetaObeliskData,
PatternDeltaObeliskData,
PatternEpsilonObeliskData,
PatternGammaObeliskData,
PeculiarShieldFrequencyData,
SecurityFirmwarePatch,
ShipFlightData,
ShipSystemsData,
SpecializedLegacyFirmware,
StrangeWakeSolutions,
TaggedEncryptionCodes,
ThargoidInterdictionTelemetry,
ThargoidMaterialCompositionData,
ThargoidResidueData,
ThargoidShipSignature,
ThargoidStructuralData,
ThargoidWakeData,
UnexpectedEmissionData,
UnidentifiedScanArchives,
UntypicalShieldScans,
UnusualEncryptedFiles,
#[cfg(not(feature = "strict"))]
Unknown(String),
}
impl Material {
pub fn is_raw(&self) -> bool {
matches!(self.into(), MaterialCategory::Raw)
}
pub fn is_manufactured(&self) -> bool {
matches!(self.into(), MaterialCategory::Manufactured)
}
pub fn is_encoded(&self) -> bool {
matches!(self.into(), MaterialCategory::Encoded)
}
}
#[derive(Debug, Error)]
pub enum MaterialError {
#[error("Unknown material: '{0}'")]
UnknownMaterial(String),
}
impl FromStr for Material {
type Err = MaterialError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let string: &str = &s.to_ascii_lowercase();
Ok(match string {
"carbon" => Material::Carbon,
"vanadium" => Material::Vanadium,
"niobium" => Material::Niobium,
"yttrium" => Material::Yttrium,
"phosphorus" => Material::Phosphorus,
"chromium" => Material::Chromium,
"molybdenum" => Material::Molybdenum,
"technetium" => Material::Technetium,
"sulphur" => Material::Sulphur,
"manganese" => Material::Manganese,
"cadmium" => Material::Cadmium,
"ruthenium" => Material::Ruthenium,
"iron" => Material::Iron,
"zinc" => Material::Zinc,
"tin" => Material::Tin,
"selenium" => Material::Selenium,
"nickel" => Material::Nickel,
"germanium" => Material::Germanium,
"tungsten" => Material::Tungsten,
"tellurium" => Material::Tellurium,
"rhenium" => Material::Rhenium,
"arsenic" => Material::Arsenic,
"mercury" => Material::Mercury,
"polonium" => Material::Polonium,
"lead" => Material::Lead,
"zirconium" => Material::Zirconium,
"boron" => Material::Boron,
"antimony" => Material::Antimony,
"chemicalstorageunits" => Material::ChemicalStorageUnits,
"chemicalprocessors" => Material::ChemicalProcessors,
"chemicaldistillery" => Material::ChemicalDistillery,
"chemicalmanipulators" => Material::ChemicalManipulators,
"pharmaceuticalisolators" => Material::PharmaceuticalIsolators,
"temperedalloys" => Material::TemperedAlloys,
"heatresistantceramics" => Material::HeatResistantCeramics,
"precipitatedalloys" => Material::PrecipitatedAlloys,
"thermicalloys" => Material::ThermicAlloys,
"militarygradealloys" => Material::MilitaryGradeAlloys,
"heatconductionwiring" => Material::HeatConductionWiring,
"heatdispersionplate" => Material::HeatDispersionPlate,
"heatexchangers" => Material::HeatExchangers,
"heatvanes" => Material::HeatVanes,
"protoheatradiators" => Material::ProtoHeatRadiators,
"basicconductors" => Material::BasicConductors,
"conductivecomponents" => Material::ConductiveComponents,
"conductiveceramics" => Material::ConductiveCeramics,
"conductivepolymers" => Material::ConductivePolymers,
"biotechconductors" => Material::BiotechConductors,
"mechanicalscrap" => Material::MechanicalScrap,
"mechanicalequipment" => Material::MechanicalEquipment,
"mechanicalcomponents" => Material::MechanicalComponents,
"configurablecomponents" => Material::ConfigurableComponents,
"improvisedcomponents" => Material::ImprovisedComponents,
"gridresistors" => Material::GridResistors,
"hybridcapacitors" => Material::HybridCapacitors,
"electrochemicalarrays" => Material::ElectrochemicalArrays,
"polymercapacitors" => Material::PolymerCapacitors,
"militarysupercapacitors" => Material::MilitarySupercapacitors,
"wornshieldemitters" => Material::WornShieldEmitters,
"shieldemitters" => Material::ShieldEmitters,
"shieldingsensors" => Material::ShieldingSensors,
"compoundshielding" => Material::CompoundShielding,
"imperialshielding" => Material::ImperialShielding,
"compactcomposites" => Material::CompactComposites,
"filamentcomposites" => Material::FilamentComposites,
"highdensitycomposites" => Material::HighDensityComposites,
"fedproprietarycomposites" => Material::ProprietaryComposites,
"fedcorecomposites" => Material::CoreDynamicsComposites,
"crystalshards" => Material::CrystalShards,
"uncutfocuscrystals" => Material::FlawedFocusCrystals,
"focuscrystals" => Material::FocusCrystals,
"refinedfocuscrystals" => Material::RefinedFocusCrystals,
"exquisitefocuscrystals" => Material::ExquisiteFocusCrystals,
"salvagedalloys" => Material::SalvagedAlloys,
"galvanisingalloys" => Material::GalvanisingAlloys,
"phasealloys" => Material::PhaseAlloys,
"protolightalloys" => Material::ProtoLightAlloys,
"protoradiolicalloys" => Material::ProtoRadiolicAlloys,
"hardenedsurfacefragments" => Material::HardenedSurfaceFragments,
"tg_causticshard" => Material::CausticShard,
"tacticalcorechip" => Material::TacticalCoreChip,
"unknowncarapace" => Material::ThargoidCarapace,
"tg_biomechanicalconduits" => Material::BioMechanicalConduits,
"tg_causticgeneratorparts" => Material::CorrosiveMechanisms,
"phasingmembraneresidue" => Material::PhasingMembraneResidue,
"thargoidenergycell" => Material::ThargoidEnergyCell,
"tg_wreckagecomponents" => Material::WreckageComponents,
"tg_causticcrystal" => Material::CausticCrystal,
"thargoidtechnologicalcomponents" => Material::ThargoidTechnologicalComponents,
"tg_weaponparts" => Material::WeaponParts,
"heatexposurespecimen" => Material::HeatExposureSpecimen,
"tg_propulsionelement" => Material::PropulsionElements,
"unknownenergysource" => Material::SensorFragment,
"thargoidorganiccircuitry" => Material::ThargoidOrganicCircuitry,
"guardian_powercell" => Material::GuardianPowerCell,
"guardian_sentinel_wreckagecomponents" => Material::GuardianWreckageComponents,
"guardian_powerconduit" => Material::GuardianPowerConduit,
"guardian_sentinel_weaponparts" => Material::GuardianSentinelWeaponParts,
"guardian_techcomponent" => Material::GuardianTechnologyComponent,
"scrambledemissiondata" => Material::ExceptionScrambledEmissionData,
"archivedemissiondata" => Material::IrregularEmissionData,
"emissiondata" => Material::UnexpectedEmissionData,
"decodedemissiondata" => Material::DecodedEmissionData,
"compactemissionsdata" => Material::AbnormalCompactEmissionData,
"disruptedwakeechoes" => Material::AtypicalDisruptedWakeEchoes,
"fsdtelemetry" => Material::AnomalousFSDTelemetry,
"wakesolutions" => Material::StrangeWakeSolutions,
"hyperspacetrajectories" => Material::EccentricHyperspaceTrajectories,
"dataminedwake" => Material::DataminedWakeExceptions,
"shieldcyclerecordings" => Material::DistortedShieldCycleRecordings,
"shieldsoakanalysis" => Material::InconsistentShieldSoakAnalysis,
"shielddensityreports" => Material::UntypicalShieldScans,
"shieldpatternanalysis" => Material::AberrantShieldPatternAnalysis,
"shieldfrequencydata" => Material::PeculiarShieldFrequencyData,
"encryptedfiles" => Material::UnusualEncryptedFiles,
"encryptioncodes" => Material::TaggedEncryptionCodes,
"symmetrickeys" => Material::OpenSymmetricKeys,
"encryptionarchives" => Material::AtypicalEncryptionArchives,
"adaptiveencryptors" => Material::AdaptiveEncryptorsCapture,
"bulkscandata" => Material::AnomalousBulkScanData,
"scanarchives" => Material::UnidentifiedScanArchives,
"scandatabanks" => Material::ClassifiedScanDatabanks,
"encodedscandata" => Material::DivergentScanData,
"classifiedscandata" => Material::ClassifiedScanFragment,
"legacyfirmware" => Material::SpecializedLegacyFirmware,
"consumerfirmware" => Material::ModifiedConsumerFirmware,
"industrialfirmware" => Material::CrackedIndustrialFirmware,
"securityfirmware" => Material::SecurityFirmwarePatch,
"embeddedfirmware" => Material::ModifiedEmbeddedFirmware,
"tg_structuraldata" => Material::ThargoidStructuralData,
"tg_shutdowndata" => Material::MassiveEnergySurgeAnalytics,
"tg_shipflightdata" => Material::ShipFlightData,
"tg_shipsystemsdata" => Material::ShipSystemsData,
"tg_interdictiondata" => Material::ThargoidInterdictionTelemetry,
"tg_compositiondata" => Material::ThargoidMaterialCompositionData,
"unknownshipsignature" => Material::ThargoidShipSignature,
"thargoidresiduedata" => Material::ThargoidResidueData,
"thargoidwakedata" => Material::ThargoidWakeData,
"ancienthistoricaldata" => Material::PatternGammaObeliskData,
"ancientculturaldata" => Material::PatternBetaObeliskData,
"ancientbiologicaldata" => Material::PatternAlphaObeliskData,
"ancientlanguagedata" => Material::PatternDeltaObeliskData,
"ancienttechnologicaldata" => Material::PatternEpsilonObeliskData,
"guardian_moduleblueprint" => Material::GuardianModuleBlueprintFragment,
"guardian_vesselblueprint" => Material::GuardianVesselBlueprintFragment,
"guardian_weaponblueprint" => Material::GuardianWeaponBlueprintFragment,
#[cfg(not(feature = "strict"))]
_ => Material::Unknown(s.to_string()),
#[cfg(feature = "strict")]
_ => return Err(MaterialError::UnknownMaterial(s.to_string())),
})
}
}
from_str_deserialize_impl!(Material);
impl Display for Material {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
Material::Antimony => "Antimony",
Material::Arsenic => "Arsenic",
Material::Boron => "Boron",
Material::Cadmium => "Cadmium",
Material::Carbon => "Carbon",
Material::Chromium => "Chromium",
Material::Germanium => "Germanium",
Material::Iron => "Iron",
Material::Lead => "Lead",
Material::Manganese => "Manganese",
Material::Mercury => "Mercury",
Material::Molybdenum => "Molybdenum",
Material::Nickel => "Nickel",
Material::Niobium => "Niobium",
Material::Phosphorus => "Phosphorus",
Material::Polonium => "Polonium",
Material::Rhenium => "Rhenium",
Material::Ruthenium => "Ruthenium",
Material::Selenium => "Selenium",
Material::Sulphur => "Sulphur",
Material::Technetium => "Technetium",
Material::Tellurium => "Tellurium",
Material::Tin => "Tin",
Material::Tungsten => "Tungsten",
Material::Vanadium => "Vanadium",
Material::Yttrium => "Yttrium",
Material::Zinc => "Zinc",
Material::Zirconium => "Zirconium",
Material::BasicConductors => "Basic Conductors",
Material::BioMechanicalConduits => "Bio-Mechanical Conduits",
Material::BiotechConductors => "Biotech Conductors",
Material::CausticCrystal => "Caustic Crystal",
Material::CausticShard => "Caustic Shard",
Material::ChemicalDistillery => "Chemical Distillery",
Material::ChemicalManipulators => "Chemical Manipulators",
Material::ChemicalProcessors => "Chemical Processors",
Material::ChemicalStorageUnits => "Chemical Storage Units",
Material::CompactComposites => "Compact Composites",
Material::CompoundShielding => "Compound Shielding",
Material::ConductiveCeramics => "Conductive Ceramics",
Material::ConductiveComponents => "Conductive Components",
Material::ConductivePolymers => "Conductive Polymers",
Material::ConfigurableComponents => "Configurable Components",
Material::CoreDynamicsComposites => "Core Dynamics Composites",
Material::CorrosiveMechanisms => "Corrosive Mechanisms",
Material::CrystalShards => "Crystal Shards",
Material::ElectrochemicalArrays => "Electrochemical Arrays",
Material::ExquisiteFocusCrystals => "Exquisite Focus Crystals",
Material::FilamentComposites => "Filament Composites",
Material::FlawedFocusCrystals => "Flawed Focus Crystals",
Material::FocusCrystals => "Focus Crystals",
Material::GalvanisingAlloys => "Galvanising Alloys",
Material::GridResistors => "Grid Resistors",
Material::GuardianPowerCell => "Guardian Power Cell",
Material::GuardianPowerConduit => "Guardian Power Conduit",
Material::GuardianSentinelWeaponParts => "Guardian Sentinel Weapon Parts",
Material::GuardianTechnologyComponent => "Guardian Technology Component",
Material::GuardianWreckageComponents => "Guardian Wreckage Components",
Material::HardenedSurfaceFragments => "Hardened Surface Fragments",
Material::HeatConductionWiring => "Heat Conduction Wiring",
Material::HeatDispersionPlate => "Heat Dispersion Plate",
Material::HeatExchangers => "Heat Exchangers",
Material::HeatExposureSpecimen => "Heat Exposure Specimen",
Material::HeatResistantCeramics => "Heat Resistant Ceramics",
Material::HeatVanes => "Heat Vanes",
Material::HighDensityComposites => "High Density Composites",
Material::HybridCapacitors => "Hybrid Capacitors",
Material::ImperialShielding => "Imperial Shielding",
Material::ImprovisedComponents => "Improvised Components",
Material::MechanicalComponents => "Mechanical Components",
Material::MechanicalEquipment => "Mechanical Equipment",
Material::MechanicalScrap => "Mechanical Scrap",
Material::MilitaryGradeAlloys => "Military Grade Alloys",
Material::MilitarySupercapacitors => "Military Supercapacitors",
Material::PharmaceuticalIsolators => "Pharmaceutical Isolators",
Material::PhaseAlloys => "Phase Alloys",
Material::PhasingMembraneResidue => "Phasing Membrane Residue",
Material::PolymerCapacitors => "Polymer Capacitors",
Material::PrecipitatedAlloys => "Precipitated Alloys",
Material::ProprietaryComposites => "Proprietary Composites",
Material::PropulsionElements => "Propulsion Elements",
Material::ProtoHeatRadiators => "Proto Heat Radiators",
Material::ProtoLightAlloys => "Proto Light Alloys",
Material::ProtoRadiolicAlloys => "Proto Radiolic Alloys",
Material::RefinedFocusCrystals => "Refined Focus Crystals",
Material::SalvagedAlloys => "Salvaged Alloys",
Material::SensorFragment => "Sensor Fragment",
Material::ShieldEmitters => "Shield Emitters",
Material::ShieldingSensors => "Shielding Sensors",
Material::TacticalCoreChip => "Tactical Core Chip",
Material::TemperedAlloys => "Tempered Alloys",
Material::ThargoidCarapace => "Thargoid Carapace",
Material::ThargoidEnergyCell => "Thargoid Energy Cell",
Material::ThargoidOrganicCircuitry => "Thargoid Organic Circuitry",
Material::ThargoidTechnologicalComponents => "Thargoid Technological Components",
Material::ThermicAlloys => "Thermic Alloys",
Material::WeaponParts => "Weapon Parts",
Material::WornShieldEmitters => "Worn Shield Emitters",
Material::WreckageComponents => "Wreckage Components",
Material::AberrantShieldPatternAnalysis => "Aberrant Shield Pattern Analysis",
Material::AbnormalCompactEmissionData => "Abnormal Compact Emissions Data",
Material::AdaptiveEncryptorsCapture => "Adaptive Encryptors Capture",
Material::AnomalousBulkScanData => "Anomalous Bulk Scan Data",
Material::AnomalousFSDTelemetry => "Anomalous FSD Telemetry",
Material::AtypicalDisruptedWakeEchoes => "Atypical Disrupted Wake Echoes",
Material::AtypicalEncryptionArchives => "Atypical Encryption Archives",
Material::ClassifiedScanDatabanks => "Classified Scan Databanks",
Material::ClassifiedScanFragment => "Classified Scan Fragment",
Material::CrackedIndustrialFirmware => "Cracked Industrial Firmware",
Material::DataminedWakeExceptions => "Datamined Wake Exceptions",
Material::DecodedEmissionData => "Decoded Emission Data",
Material::DistortedShieldCycleRecordings => "Distorted Shield Cycle Recordings",
Material::DivergentScanData => "Divergent Scan Data",
Material::EccentricHyperspaceTrajectories => "Eccentric Hyperspace Trajectories",
Material::ExceptionScrambledEmissionData => "Exceptional Scrambled Emission Data",
Material::GuardianModuleBlueprintFragment => "Guardian Module Blueprint Fragment",
Material::GuardianVesselBlueprintFragment => "Guardian Vessel Blueprint Fragment",
Material::GuardianWeaponBlueprintFragment => "Guardian Weapon Blueprint Fragment",
Material::InconsistentShieldSoakAnalysis => "Inconsistent Shield Soak Analysis",
Material::IrregularEmissionData => "Irregular Emission Data",
Material::MassiveEnergySurgeAnalytics => "Massive Energy Surge Analytics",
Material::ModifiedConsumerFirmware => "Modified Consumer Firmware",
Material::ModifiedEmbeddedFirmware => "Modified Embedded Firmware",
Material::OpenSymmetricKeys => "Open Symmetric Keys",
Material::PatternAlphaObeliskData => "Pattern Alpha Obelisk Data",
Material::PatternBetaObeliskData => "Pattern Beta Obelisk Data",
Material::PatternDeltaObeliskData => "Pattern Delta Obelisk Data",
Material::PatternEpsilonObeliskData => "Pattern Epsilon Obelisk Data",
Material::PatternGammaObeliskData => "Pattern Gamma Obelisk Data",
Material::PeculiarShieldFrequencyData => "Peculiar Shield Frequency Data",
Material::SecurityFirmwarePatch => "Security Firmware Patch",
Material::ShipFlightData => "Ship Flight Data",
Material::ShipSystemsData => "Ship Systems Data",
Material::SpecializedLegacyFirmware => "Specialised Legacy Firmware",
Material::StrangeWakeSolutions => "Strange Wake Solutions",
Material::TaggedEncryptionCodes => "Tagged Encryption Codes",
Material::ThargoidInterdictionTelemetry => "Thargoid Interdiction Telemetry",
Material::ThargoidMaterialCompositionData => "Thargoid Material Composition Data",
Material::ThargoidResidueData => "Thargoid Residue Data",
Material::ThargoidShipSignature => "Thargoid Ship Signature",
Material::ThargoidStructuralData => "Thargoid Structural Data",
Material::ThargoidWakeData => "Thargoid Wake Data",
Material::UnexpectedEmissionData => "Unexpected Emission Data",
Material::UnidentifiedScanArchives => "Unidentified Scan Archives",
Material::UntypicalShieldScans => "Untypical Shield Scans",
Material::UnusualEncryptedFiles => "Unusual Encrypted Files",
#[cfg(not(feature = "strict"))]
Material::Unknown(unknown) => return write!(f, "Unknown material: {}", unknown),
}
)
}
}