pub const IK_RATINGS: &[&str] = &[
"IK00", "IK01", "IK02", "IK03", "IK04", "IK05", "IK06", "IK07", "IK08", "IK09", "IK10", "IK10+",
];
pub const IP_CODES: &[&str] = &[
"IP20", "IP21", "IP22", "IP23", "IP24", "IP25", "IP26", "IP27", "IP28", "IP30", "IP31", "IP32", "IP33", "IP34", "IP35", "IP36", "IP37", "IP38", "IP40", "IP41", "IP42", "IP43", "IP44", "IP45", "IP46", "IP47", "IP48", "IP50", "IP51", "IP52", "IP53", "IP54", "IP55", "IP56", "IP57", "IP58", "IP60", "IP61", "IP62", "IP63", "IP64", "IP65", "IP66", "IP67", "IP68", "IP69", "IP69K",
];
pub const ELECTRICAL_SAFETY_CLASSES: &[&str] = &["0", "I", "0I", "II", "III"];
pub const INTERFACES: &[&str] = &[
"DALI Broadcast",
"DALI Addressable",
"KNX",
"0-10V",
"1-10V",
"230V",
"RF",
"WiFi",
"Bluetooth",
"Inter-Connection",
"DMX",
"DMX/RDM",
];
pub const EMERGENCY_BEHAVIOURS: &[&str] = &["None", "Combined", "EmergencyOnly"];
pub const LABELS: &[&str] = &[
"CE", "GS", "ENEC", "CCC", "VDE", "EAC", "D", "M", "MM", "F", "FF", "UL", "Handwarm",
"IFS Food",
];
pub const EMERGENCY_LIGHTING_TYPES: &[&str] = &[
"Exit Light",
"Guide Light",
"Evacuation Light",
"Reference Light",
"For Signage",
"For Lighting",
];
pub const IMAGE_TYPES: &[&str] = &[
"Product Picture",
"Application Picture",
"Technical Sketch",
"Other",
];
pub const CONTENT_TYPES: &[&str] = &[
"ldc/eulumdat",
"ldc/ies",
"ldc/iesxml",
"image/png",
"image/svg",
"image/jpg",
"geo/l3d",
"geo/r3d",
"geo/m3d",
"document/pdf",
"symbol/dxf",
"symbol/svg",
"sensor/sensxml",
"sensor/sensldt",
"spectrum/text",
"other",
];
pub const ADJUSTABILITIES: &[&str] = &[
"Fixed",
"Orientation",
"Turn",
"Tilt",
"Cardanic",
"Height adjustable",
"User defined",
];
pub const PROTECTIVE_AREAS: &[&str] = &[
"Cleanroom suitable",
"Ball-impact proof",
"Drive/Roll-over proof",
];
pub const PRODUCT_FORMS: &[&str] = &[
"Round", "Rounded", "Square", "Linear", "Areal", "Sphere", "Cuboid", "Cylinder", "Cone",
"Special",
];
pub const DETECTOR_TYPES: &[&str] = &[
"Motion Detector",
"Presence Detector",
"Daylight Detector",
"Other",
];
pub const DETECTION_METHODS: &[&str] = &[
"Passive Infrared",
"High Frequency",
"Microwave",
"Ultrasonic",
"Camera",
"Other",
];
pub const DETECTOR_CHARACTERISTICS: &[&str] = &["Round", "Square", "Other"];
pub const CIE97_LAMP_TYPES: &[&str] = &[
"Incandescent",
"Halogen",
"Fluorescent Triphosphor",
"Fluorescent Halophosphate",
"Compact Fluorescent",
"Mercury",
"Metal Halide (250/400W)",
"Ceramic Metal Halide (50/150W)",
"High Pressure Sodium (250/400W)",
];
pub const CIE97_LUMINAIRE_TYPES: &[&str] = &[
"Bare Batten",
"Open Top Housing (Natural Ventilated)",
"Closed Top Housing (Unventilated)",
"Enclosed IP2X",
"Dust Proof IP5X",
"Enclosed Indirect (Uplight)",
"Airhandling, Forced Ventilated",
];
pub const ROOM_CONDITIONS: &[&str] = &[
"Very Clean",
"Clean",
"Normal",
"Moderate",
"Dirty",
"Very Dirty",
];
pub const COLOR_TOLERANCES: &[&str] = &[
"1 SDCM", "2 SDCM", "3 SDCM", "4 SDCM", "5 SDCM", "6 SDCM", "7 SDCM",
];
pub const TARGET_MODEL_TYPES: &[&str] = &["l3d", "m3d", "r3d"];
pub const LEVELS_OF_DETAIL: &[&str] = &["Low", "Medium", "High"];
pub const MELANOPIC_CHANNEL_TYPES: &[&str] = &[
"Red",
"Green",
"Blue",
"Amber",
"White",
"CoolWhite",
"WarmWhite",
"DaylightWhite",
"NaturalWhite",
"NeutralWhite",
];
pub const FLUX_FACTOR_TYPES: &[&str] = &["Steps", "Continuously"];
pub const FILE_TYPES: &[&str] = &["localFileName", "url"];
pub const CURRENT_TYPES: &[&str] = &["AC", "DC", "UC"];
pub const FREQUENCIES: &[&str] = &["50", "60", "50/60", "400"];
pub const DIRECTIVES: &[&str] = &["ATEX", "IECEx", "CEC", "NEC"];
pub const HAZARDOUS_CLASSES: &[&str] = &["I", "II", "III"];
pub const DIVISIONS: &[&str] = &["1", "2"];
pub const HAZARDOUS_GROUPS_UNION: &[&str] = &[
"A", "B", "C", "D", "E", "F", "G", "I", "II", "IIA", "IIB", "IIB + H2", "IIC", "III", "IIIA",
"IIIB", "IIIC",
];
pub const HAZARDOUS_ZONES: &[&str] = &["0", "1", "2", "20", "21", "22"];
pub const TEMPERATURE_CLASSES: &[&str] = &[
"T1", "T2", "T2A", "T2B", "T2C", "T2D", "T3", "T3A", "T3B", "T3C", "T4", "T4A", "T5", "T6",
];
pub const EX_CODES: &[&str] = &[
"da", "db", "dc", "eb", "ec", "ia", "ib", "ic", "ma", "mb", "mc", "nC", "nR", "ob", "oc",
"op is", "op pr", "op sh", "pxb", "pyb", "pyc", "pzc", "q", "ta", "tb", "tc",
];
pub const EQUIPMENT_PROTECTION_LEVELS: &[&str] = &["Ga", "Gb", "Gc", "Da", "Db", "Dc", "Ma", "Mb"];
pub const EQUIPMENT_GROUPS: &[&str] = &["I", "II"];
pub const EQUIPMENT_CATEGORIES: &[&str] = &["M1", "M2", "1G", "2G", "3G", "1D", "2D", "3D"];
pub const ATMOSPHERES: &[&str] = &["G", "D"];
pub const LIGHT_DISTRIBUTIONS: &[&str] = &[
"Laterally symmetrical narrow",
"Laterally symmetrical medium",
"Laterally symmetrical wide",
"Symmetrical in each quadrant",
"Symmetric about 0-180 plane",
"Symmetric about 90-270 plane",
"Asymmetrical",
"Asymmetrical flood",
"Asymmetrical wide flood",
"Diffuse half spherical",
"Diffuse full spherical",
"Direct",
"Indirect",
"Direct indirect",
"Other",
];
pub const APPLICATIONS: &[&str] = &[
"Interior: Traffic Zones",
"Interior: Traffic Zones: Corridors",
"Interior: Traffic Zones: Staircases",
"Interior: Traffic Zones: Loading Zones",
"Interior: Traffic Zones: Cove Lighting / Cornices (Indoor)",
"Interior: General Areas (Interior)",
"Interior: General Areas (Interior): Break Rooms",
"Interior: General Areas (Interior): Reception Areas",
"Interior: Office",
"Interior: Office: Office Desks",
"Interior: Office: Group Offices",
"Interior: Office: Discussions",
"Interior: Office: Archives",
"Interior: Industry/Craft",
"Interior: Industry/Craft: Industrial Workshops",
"Interior: Industry/Craft: Warehouses",
"Interior: Industry/Craft: Cold Storage Facilities",
"Interior: Industry/Craft: Kitchens",
"Interior: Industry/Craft: Assembly Work Stations",
"Interior: Industry/Craft: Machine Illumination",
"Interior: Industry/Craft: Control Work Stations",
"Interior: Industry/Craft: Laboratories",
"Interior: Industry/Craft: Hangars",
"Interior: Shop Lighting",
"Interior: Shop Lighting: Retail",
"Interior: Shop Lighting: Food",
"Interior: Shop Lighting: Clothing",
"Interior: Shop Lighting: Display Windows",
"Interior: Shop Lighting: Halls",
"Interior: Shop Lighting: Great Halls",
"Interior: Shop Lighting: Mirrors",
"Interior: Public Areas",
"Interior: Public Areas: Restaurants",
"Interior: Public Areas: Theatres",
"Interior: Public Areas: Railway Stations",
"Interior: Public Areas: Museums",
"Interior: Public Areas: Fairs",
"Interior: Public Areas: Prisons",
"Interior: Public Areas: Canteens",
"Interior: Emergency Lighting",
"Interior: Emergency Lighting: Emergency Lighting",
"Interior: Emergency Lighting: Signal Lighting",
"Interior: Educational Facilities",
"Interior: Educational Facilities: Classrooms",
"Interior: Educational Facilities: Libraries",
"Interior: Educational Facilities: Lounges",
"Interior: Educational Facilities: Sports Halls",
"Interior: Private Areas",
"Interior: Private Areas: Living Areas",
"Interior: Private Areas: Baths",
"Interior: Private Areas: Kitchens",
"Interior: Hospitals and Care Places",
"Interior: Hospitals and Care Places: Hospital Wards",
"Interior: Hospitals and Care Places: Health Care Patient Rooms",
"Interior: Hospitals and Care Places: Health Care Clean Room Areas",
"Interior: Hospitals and Care Places: Health Care Examination Rooms",
"Interior: Hospitals and Care Places: Health Care Circulation Areas",
"Exterior: General Areas (Exterior)",
"Exterior: General Areas (Exterior): Places",
"Exterior: General Areas (Exterior): Parks",
"Exterior: General Areas (Exterior): Underpasses",
"Exterior: General Areas (Exterior): (Outdoor) Stairs",
"Exterior: General Areas (Exterior): Platform-Roofs",
"Exterior: General Areas (Exterior): Parking Spaces (Indoor)",
"Exterior: General Areas (Exterior): Outdoor Parkings",
"Exterior: General Areas (Exterior): Pools",
"Exterior: General Areas (Exterior): Fountains",
"Exterior: Streets",
"Exterior: Streets: Motorways",
"Exterior: Streets: Access Roads",
"Exterior: Streets: Residential Areas",
"Exterior: Streets: Bicycle Paths",
"Exterior: Streets: Footpaths",
"Exterior: Streets: Petrol-Gas Stations",
"Exterior: Streets: Tunnels",
"Exterior: Sports Fields",
"Exterior: Sports Fields: Spotlightings",
"Exterior: Other",
"Exterior: Other: Facades",
];
pub fn is_canonical(canonical_set: &'static [&'static str], value: &str) -> bool {
canonical_set.iter().any(|v| *v == value)
}
pub fn canonical_set_for(xsd_name: &str) -> Option<&'static [&'static str]> {
match xsd_name {
"IKRating" => Some(IK_RATINGS),
"IngressProtectionIPCode" => Some(IP_CODES),
"ElectricalSafetyClass" => Some(ELECTRICAL_SAFETY_CLASSES),
"Interface" => Some(INTERFACES),
"@emergencyBehaviour" => Some(EMERGENCY_BEHAVIOURS),
"Label" => Some(LABELS),
"DedicatedEmergencyLightingType" => Some(EMERGENCY_LIGHTING_TYPES),
"@imageType" => Some(IMAGE_TYPES),
"@contentType" => Some(CONTENT_TYPES),
"Adjustability" => Some(ADJUSTABILITIES),
"Area" => Some(PROTECTIVE_AREAS),
"ProductForm" => Some(PRODUCT_FORMS),
"DetectorType" => Some(DETECTOR_TYPES),
"DetectionMethod" => Some(DETECTION_METHODS),
"DetectorCharacteristic" => Some(DETECTOR_CHARACTERISTICS),
"Cie97LampType" => Some(CIE97_LAMP_TYPES),
"Cie97LuminaireType" => Some(CIE97_LUMINAIRE_TYPES),
"@roomCondition" => Some(ROOM_CONDITIONS),
"InitialColorTolerance" | "MaintainedColorTolerance" => Some(COLOR_TOLERANCES),
"@targetModelType" => Some(TARGET_MODEL_TYPES),
"@levelOfDetail" => Some(LEVELS_OF_DETAIL),
"Directive" => Some(DIRECTIVES),
"Class" => Some(HAZARDOUS_CLASSES),
"Division" => Some(DIVISIONS),
"Group" => Some(HAZARDOUS_GROUPS_UNION),
"Zone" => Some(HAZARDOUS_ZONES),
"TemperatureClass" => Some(TEMPERATURE_CLASSES),
"ExCode" => Some(EX_CODES),
"EquipmentProtectionLevel" => Some(EQUIPMENT_PROTECTION_LEVELS),
"EquipmentGroup" => Some(EQUIPMENT_GROUPS),
"EquipmentCategory" => Some(EQUIPMENT_CATEGORIES),
"Atmosphere" => Some(ATMOSPHERES),
"@Frequency" => Some(FREQUENCIES),
"@Type" => Some(CURRENT_TYPES),
"LightDistribution" => Some(LIGHT_DISTRIBUTIONS),
"Application" => Some(APPLICATIONS),
_ => None,
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum CanonicalCheck {
Canonical,
NonCanonical,
Empty,
}
pub fn check(xsd_name: &str, value: Option<&str>) -> CanonicalCheck {
let v = match value {
Some(s) if !s.is_empty() => s,
_ => return CanonicalCheck::Empty,
};
match canonical_set_for(xsd_name) {
Some(set) if is_canonical(set, v) => CanonicalCheck::Canonical,
Some(_) => CanonicalCheck::NonCanonical,
None => CanonicalCheck::Empty, }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn membership_checks() {
assert!(is_canonical(IK_RATINGS, "IK03"));
assert!(!is_canonical(IK_RATINGS, "IK11"));
assert!(is_canonical(IP_CODES, "IP65"));
assert!(!is_canonical(IP_CODES, "IP99"));
assert!(is_canonical(ELECTRICAL_SAFETY_CLASSES, "0"));
assert!(is_canonical(ELECTRICAL_SAFETY_CLASSES, "0I"));
assert!(!is_canonical(ELECTRICAL_SAFETY_CLASSES, "IV"));
assert!(is_canonical(INTERFACES, "DALI Broadcast"));
assert!(!is_canonical(INTERFACES, "DALI Mesh"));
assert!(is_canonical(LABELS, "CE"));
assert!(is_canonical(EMERGENCY_BEHAVIOURS, "EmergencyOnly"));
assert!(is_canonical(EMERGENCY_LIGHTING_TYPES, "Exit Light"));
assert!(is_canonical(IMAGE_TYPES, "Product Picture"));
assert!(is_canonical(CONTENT_TYPES, "ldc/eulumdat"));
assert!(!is_canonical(CONTENT_TYPES, "ldc/dialux"));
}
}