// Generated by cimgen — do not edit by hand.
#![allow(clippy::all, dead_code, unused)]
use cimdecoder::CimDataset;
use crate::Violation;
use crate::helpers::*;
pub fn validate_p61970_600_2_operation_ap_con_simple_shacl(dataset: &CimDataset) -> Vec<Violation> {
let mut v = Vec::new();
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_power_system_resource_re_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_unit_multiplier_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_unit_symbol_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_phases_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_measurement_type_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_identified_object_description_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_terminal_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_unit_multiplier_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_phases_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_unit_symbol_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_accumulator_limit_limit_set_re_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_identified_object_description_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_accumulator_limit_limit_set_ha_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_accumulator_limit_value_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_limit_set_is_percentage_li_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_identified_object_name_req_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_identified_object_descript_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_identified_object_m_rid_re_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_accumulator_limit_set_meas_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_accumulator_limit_set_meas_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_accumulator_reset_accumulator_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_unit_multiplier_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_unit_multiplier_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_operation_in_progress_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_accumulator_reset_accumulator_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_time_stamp_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_unit_symbol_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_power_system_resource_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_control_type_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_unit_symbol_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_identified_object_description_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_time_stamp_datatype(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_accumulator_value_accumulator_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_measurement_value_measurement_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_measurement_value_measurement_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_measurement_value_time_stamp_m_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_identified_object_description_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_accumulator_value_accumulator_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_measurement_value_sensor_accur_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_measurement_value_time_stamp_d_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_phases_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_identified_object_description_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_phases_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_power_system_resource_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_measurement_type_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_unit_symbol_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_terminal_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_analog_positive_flow_in_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_unit_multiplier_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_unit_multiplier_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_unit_symbol_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_identified_object_description_max_c_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_analog_limit_value_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_analog_limit_limit_set_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_analog_limit_limit_set_has_value(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_analog_limit_set_measurements_h_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_limit_set_is_percentage_limits_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_identified_object_description_m_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_analog_limit_set_measurements_m_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_measurement_value_sensor_accuracy_m_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_measurement_value_measurement_value_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_measurement_value_time_stamp_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_measurement_value_time_stamp_datatype(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_identified_object_description_max_c_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_analog_value_analog_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_measurement_value_measurement_value_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_analog_value_analog_has_value(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_command_value_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_control_unit_symbol_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_control_power_system_resource_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_control_operation_in_progress_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_control_time_stamp_datatype(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_control_control_type_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_identified_object_description_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_control_time_stamp_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_command_value_alias_set_has_value(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_control_unit_multiplier_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_command_value_alias_set_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_control_unit_symbol_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_command_normal_value_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_command_discrete_value_has_value(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_command_discrete_value_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_command_control_unit_multiplier_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_unit_symbol_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_unit_symbol_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_phases_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_discrete_value_alias_set_has_value(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_unit_multiplier_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_phases_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_terminal_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_identified_object_description_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_discrete_value_alias_set_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_power_system_resource_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_measurement_type_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_unit_multiplier_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_measurement_value_sensor_accuracy_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_discrete_value_discrete_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_measurement_value_time_stamp_data_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_measurement_value_measurement_val_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_measurement_value_measurement_val_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_discrete_value_discrete_has_value(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_measurement_value_time_stamp_max_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_identified_object_description_max_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_validity_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_test_max_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_suspect_m_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_operator_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_oscillato_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_source_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_bad_refer_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_validity_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_old_data_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_failure_m_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_measurement_value_qual_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_estimator_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_out_of_ra_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_source_ma_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_over_flow_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_measurement_value_qual_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_source_identified_object_name_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_source_identified_object_m_rid_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_source_identified_object_descr_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_raise_lower_command_value_al_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_analog_control_min_value_req_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_analog_control_analog_value_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_operation_in_progres_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_control_type_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_time_stamp_datatype(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_identified_object_descriptio_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_identified_object_m_rid_requ_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_analog_control_analog_value_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_analog_control_max_value_req_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_time_stamp_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_power_system_resourc_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_raise_lower_command_value_al_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_unit_multiplier_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_unit_multiplier_max_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_unit_symbol_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_unit_symbol_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_control_type_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_unit_symbol_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_analog_control_min_value_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_unit_symbol_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_operation_in_progress_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_time_stamp_datatype(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_identified_object_description_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_unit_multiplier_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_set_point_value_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_time_stamp_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_power_system_resource_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_analog_control_analog_value_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_set_point_normal_value_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_unit_multiplier_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_analog_control_max_value_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_set_point_analog_control_analog_value_has_value(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_measurement_type_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_identified_object_description_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_power_system_reso_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_terminal_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_phases_max_count(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_unit_multiplier_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_unit_multiplier_r_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_phases_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_unit_symbol_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_unit_symbol_in(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_string_measurement_valu_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_identified_object_m_rid_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_measurement_value_time_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_string_measurement_valu_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_measurement_value_time_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_measurement_value_measu_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_measurement_value_senso_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_identified_object_name_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_measurement_value_measu_etc_2(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_identified_object_descr_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_value_alias_set_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_value_alias_set_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_value_alias_set_identified_object_description_ma_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_value_to_alias_value_alias_set_re_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_value_to_alias_value_alias_set_ha_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_identified_object_m_rid_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_identified_object_description_max_etc(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_identified_object_name_required(dataset));
v.extend(check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_value_to_alias_value_required(dataset));
v
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_power_system_resource_re_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Accumulator>() {
Some(o) => o, None => continue,
};
if obj.base.power_system_resource.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.PowerSystemResource-cardinality".to_string(),
class: "Accumulator".to_string(),
property: "Measurement.PowerSystemResource".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.PowerSystemResource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_unit_multiplier_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitMultiplier.k", "UnitMultiplier.da", "UnitMultiplier.Z", "UnitMultiplier.y", "UnitMultiplier.micro", "UnitMultiplier.Y", "UnitMultiplier.z", "UnitMultiplier.G", "UnitMultiplier.h", "UnitMultiplier.T", "UnitMultiplier.E", "UnitMultiplier.f", "UnitMultiplier.c", "UnitMultiplier.none", "UnitMultiplier.d", "UnitMultiplier.a", "UnitMultiplier.P", "UnitMultiplier.p", "UnitMultiplier.m", "UnitMultiplier.M", "UnitMultiplier.n"];
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Accumulator>() {
Some(o) => o, None => continue,
};
if obj.base.unit_multiplier.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_multiplier.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitMultiplier-datatype".to_string(),
class: "Accumulator".to_string(),
property: "Measurement.unitMultiplier".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitMultiplier-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_unit_symbol_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitSymbol.WPerm2", "UnitSymbol.molPerkg", "UnitSymbol.HPerm", "UnitSymbol.Ah", "UnitSymbol.N", "UnitSymbol.mPerm3", "UnitSymbol.sPers", "UnitSymbol.mol", "UnitSymbol.m3Uncompensated", "UnitSymbol.VPerV", "UnitSymbol.kgm2", "UnitSymbol.radPers", "UnitSymbol.m3Perkg", "UnitSymbol.SPerm", "UnitSymbol.Wb", "UnitSymbol.bar", "UnitSymbol.kat", "UnitSymbol.V2", "UnitSymbol.cosPhi", "UnitSymbol.Oe", "UnitSymbol.min", "UnitSymbol.Vs", "UnitSymbol.Q", "UnitSymbol.V2h", "UnitSymbol.VA", "UnitSymbol.dBm", "UnitSymbol.CPerkg", "UnitSymbol.Btu", "UnitSymbol.JPerkg", "UnitSymbol.lm", "UnitSymbol.Qh", "UnitSymbol.mPers2", "UnitSymbol.ha", "UnitSymbol.s", "UnitSymbol.rotPers", "UnitSymbol.tonne", "UnitSymbol.NPerm", "UnitSymbol.A", "UnitSymbol.A2", "UnitSymbol.Pa", "UnitSymbol.VAh", "UnitSymbol.none", "UnitSymbol.HzPers", "UnitSymbol.JPerm2", "UnitSymbol.JPerkgK", "UnitSymbol.Nm", "UnitSymbol.deg", "UnitSymbol.S", "UnitSymbol.kgPerJ", "UnitSymbol.As", "UnitSymbol.ohm", "UnitSymbol.A2h", "UnitSymbol.JPerm3", "UnitSymbol.T", "UnitSymbol.m2Pers", "UnitSymbol.onePerm", "UnitSymbol.lx", "UnitSymbol.lPers", "UnitSymbol.d", "UnitSymbol.C", "UnitSymbol.WPersr", "UnitSymbol.JPerK", "UnitSymbol.character", "UnitSymbol.APerA", "UnitSymbol.rad", "UnitSymbol.kg", "UnitSymbol.V", "UnitSymbol.therm", "UnitSymbol.CPerm3", "UnitSymbol.VArh", "UnitSymbol.Mx", "UnitSymbol.ppm", "UnitSymbol.WPerW", "UnitSymbol.JPermolK", "UnitSymbol.WPermK", "UnitSymbol.ohmPerm", "UnitSymbol.cd", "UnitSymbol.WPerm2sr", "UnitSymbol.h", "UnitSymbol.G", "UnitSymbol.VPerm", "UnitSymbol.Bq", "UnitSymbol.F", "UnitSymbol.Vh", "UnitSymbol.W", "UnitSymbol.lPerl", "UnitSymbol.GyPers", "UnitSymbol.HzPerHz", "UnitSymbol.Sv", "UnitSymbol.H", "UnitSymbol.molPerm3", "UnitSymbol.degC", "UnitSymbol.mmHg", "UnitSymbol.JPermol", "UnitSymbol.sr", "UnitSymbol.count", "UnitSymbol.CPerm2", "UnitSymbol.mPers", "UnitSymbol.radPers2", "UnitSymbol.m3Pers", "UnitSymbol.KPers", "UnitSymbol.anglemin", "UnitSymbol.PaPers", "UnitSymbol.VPerHz", "UnitSymbol.ohmm", "UnitSymbol.J", "UnitSymbol.m2", "UnitSymbol.Hz", "UnitSymbol.APerm", "UnitSymbol.m3Perh", "UnitSymbol.rev", "UnitSymbol.WPerA", "UnitSymbol.l", "UnitSymbol.K", "UnitSymbol.m3", "UnitSymbol.katPerm3", "UnitSymbol.WPers", "UnitSymbol.lPerh", "UnitSymbol.dB", "UnitSymbol.m", "UnitSymbol.FPerm", "UnitSymbol.A2s", "UnitSymbol.gal", "UnitSymbol.kn", "UnitSymbol.Pas", "UnitSymbol.VPerVAr", "UnitSymbol.VPerVA", "UnitSymbol.VAr", "UnitSymbol.anglesec", "UnitSymbol.ft3", "UnitSymbol.charPers", "UnitSymbol.m3Compensated", "UnitSymbol.molPermol", "UnitSymbol.M", "UnitSymbol.onePerHz", "UnitSymbol.JPers", "UnitSymbol.Wh", "UnitSymbol.Gy", "UnitSymbol.gPerg", "UnitSymbol.kgm", "UnitSymbol.kgPerm3"];
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Accumulator>() {
Some(o) => o, None => continue,
};
if obj.base.unit_symbol.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_symbol.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitSymbol-datatype".to_string(),
class: "Accumulator".to_string(),
property: "Measurement.unitSymbol".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitSymbol-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_phases_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Measurement.phases") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.phases-cardinality".to_string(),
class: "Accumulator".to_string(),
property: "Measurement.phases".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.phases-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Accumulator>() {
Some(o) => o, None => continue,
};
if obj.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "Accumulator".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_measurement_type_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Accumulator>() {
Some(o) => o, None => continue,
};
if obj.base.measurement_type.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.measurementType-cardinality".to_string(),
class: "Accumulator".to_string(),
property: "Measurement.measurementType".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.measurementType-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Accumulator>() {
Some(o) => o, None => continue,
};
if obj.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "Accumulator".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_identified_object_description_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "Accumulator".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_terminal_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Measurement.Terminal") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.Terminal-cardinality".to_string(),
class: "Accumulator".to_string(),
property: "Measurement.Terminal".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.Terminal-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_unit_multiplier_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Accumulator>() {
Some(o) => o, None => continue,
};
if obj.base.unit_multiplier.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitMultiplier-cardinality".to_string(),
class: "Accumulator".to_string(),
property: "Measurement.unitMultiplier".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitMultiplier-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_phases_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["PhaseCode.CN", "PhaseCode.XY", "PhaseCode.A", "PhaseCode.s12", "PhaseCode.B", "PhaseCode.ABCN", "PhaseCode.C", "PhaseCode.s1N", "PhaseCode.XYN", "PhaseCode.AB", "PhaseCode.X", "PhaseCode.s2N", "PhaseCode.AC", "PhaseCode.s2", "PhaseCode.ABC", "PhaseCode.XN", "PhaseCode.s12N", "PhaseCode.BC", "PhaseCode.AN", "PhaseCode.none", "PhaseCode.ACN", "PhaseCode.s1", "PhaseCode.BN", "PhaseCode.BCN", "PhaseCode.N", "PhaseCode.ABN"];
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Accumulator>() {
Some(o) => o, None => continue,
};
if obj.base.phases.is_none() { continue; }
if !ALLOWED.contains(&obj.base.phases.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.phases-datatype".to_string(),
class: "Accumulator".to_string(),
property: "Measurement.phases".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.phases-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_measurement_unit_symbol_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Accumulator").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Accumulator>() {
Some(o) => o, None => continue,
};
if obj.base.unit_symbol.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitSymbol-cardinality".to_string(),
class: "Accumulator".to_string(),
property: "Measurement.unitSymbol".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitSymbol-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimit").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorLimit>() {
Some(o) => o, None => continue,
};
if obj.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "AccumulatorLimit".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_accumulator_limit_limit_set_re_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimit").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorLimit>() {
Some(o) => o, None => continue,
};
if obj.limit_set.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AccumulatorLimit.LimitSet-cardinality".to_string(),
class: "AccumulatorLimit".to_string(),
property: "AccumulatorLimit.LimitSet".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "AccumulatorLimit.LimitSet-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimit").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorLimit>() {
Some(o) => o, None => continue,
};
if obj.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "AccumulatorLimit".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_identified_object_description_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimit").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "AccumulatorLimit".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_accumulator_limit_limit_set_ha_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimit").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorLimit>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.limit_set.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["AccumulatorLimitSet"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AccumulatorLimit.LimitSet-valueType".to_string(),
class: "AccumulatorLimit".to_string(),
property: "AccumulatorLimit.LimitSet".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:AccumulatorLimitSet".to_string(),
severity: "sh:Violation".to_string(),
name: "AccumulatorLimit.LimitSet-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_accumulator_limit_value_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimit").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorLimit>() {
Some(o) => o, None => continue,
};
if obj.value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AccumulatorLimit.value-cardinality".to_string(),
class: "AccumulatorLimit".to_string(),
property: "AccumulatorLimit.value".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "AccumulatorLimit.value-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_limit_set_is_percentage_li_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimitSet").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("LimitSet.isPercentageLimits") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:LimitSet.isPercentageLimits-cardinality".to_string(),
class: "AccumulatorLimitSet".to_string(),
property: "LimitSet.isPercentageLimits".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "LimitSet.isPercentageLimits-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_identified_object_name_req_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimitSet").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorLimitSet>() {
Some(o) => o, None => continue,
};
if obj.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "AccumulatorLimitSet".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_identified_object_descript_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimitSet").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "AccumulatorLimitSet".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_identified_object_m_rid_re_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimitSet").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorLimitSet>() {
Some(o) => o, None => continue,
};
if obj.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "AccumulatorLimitSet".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_accumulator_limit_set_meas_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimitSet").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorLimitSet>() {
Some(o) => o, None => continue,
};
if obj.measurements.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AccumulatorLimitSet.Measurements-cardinality".to_string(),
class: "AccumulatorLimitSet".to_string(),
property: "AccumulatorLimitSet.Measurements".to_string(),
message: "Cardinality violation. Lower bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "AccumulatorLimitSet.Measurements-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_limit_set_accumulator_limit_set_meas_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorLimitSet").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorLimitSet>() {
Some(o) => o, None => continue,
};
for r in &obj.measurements {
let ref_id = r.mrid.trim_start_matches('#');
if ref_id.is_empty() { continue; }
if let Some(ref_entry) = dataset.entries.get(ref_id) {
let allowed: &[&str] = &["Accumulator"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AccumulatorLimitSet.Measurements-valueType".to_string(),
class: "AccumulatorLimitSet".to_string(),
property: "AccumulatorLimitSet.Measurements".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:Accumulator".to_string(),
severity: "sh:Violation".to_string(),
name: "AccumulatorLimitSet.Measurements-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_accumulator_reset_accumulator_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorReset>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.accumulator_value.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["AccumulatorValue"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AccumulatorReset.AccumulatorValue-valueType".to_string(),
class: "AccumulatorReset".to_string(),
property: "AccumulatorReset.AccumulatorValue".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:AccumulatorValue".to_string(),
severity: "sh:Violation".to_string(),
name: "AccumulatorReset.AccumulatorValue-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_unit_multiplier_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.unitMultiplier") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitMultiplier-cardinality".to_string(),
class: "AccumulatorReset".to_string(),
property: "Control.unitMultiplier".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitMultiplier-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_unit_multiplier_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitMultiplier.k", "UnitMultiplier.da", "UnitMultiplier.Z", "UnitMultiplier.y", "UnitMultiplier.micro", "UnitMultiplier.Y", "UnitMultiplier.z", "UnitMultiplier.G", "UnitMultiplier.h", "UnitMultiplier.T", "UnitMultiplier.E", "UnitMultiplier.f", "UnitMultiplier.c", "UnitMultiplier.none", "UnitMultiplier.d", "UnitMultiplier.a", "UnitMultiplier.P", "UnitMultiplier.p", "UnitMultiplier.m", "UnitMultiplier.M", "UnitMultiplier.n"];
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorReset>() {
Some(o) => o, None => continue,
};
if obj.base.unit_multiplier.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_multiplier.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitMultiplier-datatype".to_string(),
class: "AccumulatorReset".to_string(),
property: "Control.unitMultiplier".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitMultiplier-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorReset>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "AccumulatorReset".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_operation_in_progress_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.operationInProgress") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.operationInProgress-cardinality".to_string(),
class: "AccumulatorReset".to_string(),
property: "Control.operationInProgress".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.operationInProgress-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_accumulator_reset_accumulator_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorReset>() {
Some(o) => o, None => continue,
};
if obj.accumulator_value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AccumulatorReset.AccumulatorValue-cardinality".to_string(),
class: "AccumulatorReset".to_string(),
property: "AccumulatorReset.AccumulatorValue".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "AccumulatorReset.AccumulatorValue-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_time_stamp_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.timeStamp") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.timeStamp-cardinality".to_string(),
class: "AccumulatorReset".to_string(),
property: "Control.timeStamp".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.timeStamp-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_unit_symbol_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.unitSymbol") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitSymbol-cardinality".to_string(),
class: "AccumulatorReset".to_string(),
property: "Control.unitSymbol".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitSymbol-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_power_system_resource_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.PowerSystemResource") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.PowerSystemResource-cardinality".to_string(),
class: "AccumulatorReset".to_string(),
property: "Control.PowerSystemResource".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.PowerSystemResource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_control_type_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorReset>() {
Some(o) => o, None => continue,
};
if obj.base.control_type.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.controlType-cardinality".to_string(),
class: "AccumulatorReset".to_string(),
property: "Control.controlType".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.controlType-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_unit_symbol_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitSymbol.WPerm2", "UnitSymbol.molPerkg", "UnitSymbol.HPerm", "UnitSymbol.Ah", "UnitSymbol.N", "UnitSymbol.mPerm3", "UnitSymbol.sPers", "UnitSymbol.mol", "UnitSymbol.m3Uncompensated", "UnitSymbol.VPerV", "UnitSymbol.kgm2", "UnitSymbol.radPers", "UnitSymbol.m3Perkg", "UnitSymbol.SPerm", "UnitSymbol.Wb", "UnitSymbol.bar", "UnitSymbol.kat", "UnitSymbol.V2", "UnitSymbol.cosPhi", "UnitSymbol.Oe", "UnitSymbol.min", "UnitSymbol.Vs", "UnitSymbol.Q", "UnitSymbol.V2h", "UnitSymbol.VA", "UnitSymbol.dBm", "UnitSymbol.CPerkg", "UnitSymbol.Btu", "UnitSymbol.JPerkg", "UnitSymbol.lm", "UnitSymbol.Qh", "UnitSymbol.mPers2", "UnitSymbol.ha", "UnitSymbol.s", "UnitSymbol.rotPers", "UnitSymbol.tonne", "UnitSymbol.NPerm", "UnitSymbol.A", "UnitSymbol.A2", "UnitSymbol.Pa", "UnitSymbol.VAh", "UnitSymbol.none", "UnitSymbol.HzPers", "UnitSymbol.JPerm2", "UnitSymbol.JPerkgK", "UnitSymbol.Nm", "UnitSymbol.deg", "UnitSymbol.S", "UnitSymbol.kgPerJ", "UnitSymbol.As", "UnitSymbol.ohm", "UnitSymbol.A2h", "UnitSymbol.JPerm3", "UnitSymbol.T", "UnitSymbol.m2Pers", "UnitSymbol.onePerm", "UnitSymbol.lx", "UnitSymbol.lPers", "UnitSymbol.d", "UnitSymbol.C", "UnitSymbol.WPersr", "UnitSymbol.JPerK", "UnitSymbol.character", "UnitSymbol.APerA", "UnitSymbol.rad", "UnitSymbol.kg", "UnitSymbol.V", "UnitSymbol.therm", "UnitSymbol.CPerm3", "UnitSymbol.VArh", "UnitSymbol.Mx", "UnitSymbol.ppm", "UnitSymbol.WPerW", "UnitSymbol.JPermolK", "UnitSymbol.WPermK", "UnitSymbol.ohmPerm", "UnitSymbol.cd", "UnitSymbol.WPerm2sr", "UnitSymbol.h", "UnitSymbol.G", "UnitSymbol.VPerm", "UnitSymbol.Bq", "UnitSymbol.F", "UnitSymbol.Vh", "UnitSymbol.W", "UnitSymbol.lPerl", "UnitSymbol.GyPers", "UnitSymbol.HzPerHz", "UnitSymbol.Sv", "UnitSymbol.H", "UnitSymbol.molPerm3", "UnitSymbol.degC", "UnitSymbol.mmHg", "UnitSymbol.JPermol", "UnitSymbol.sr", "UnitSymbol.count", "UnitSymbol.CPerm2", "UnitSymbol.mPers", "UnitSymbol.radPers2", "UnitSymbol.m3Pers", "UnitSymbol.KPers", "UnitSymbol.anglemin", "UnitSymbol.PaPers", "UnitSymbol.VPerHz", "UnitSymbol.ohmm", "UnitSymbol.J", "UnitSymbol.m2", "UnitSymbol.Hz", "UnitSymbol.APerm", "UnitSymbol.m3Perh", "UnitSymbol.rev", "UnitSymbol.WPerA", "UnitSymbol.l", "UnitSymbol.K", "UnitSymbol.m3", "UnitSymbol.katPerm3", "UnitSymbol.WPers", "UnitSymbol.lPerh", "UnitSymbol.dB", "UnitSymbol.m", "UnitSymbol.FPerm", "UnitSymbol.A2s", "UnitSymbol.gal", "UnitSymbol.kn", "UnitSymbol.Pas", "UnitSymbol.VPerVAr", "UnitSymbol.VPerVA", "UnitSymbol.VAr", "UnitSymbol.anglesec", "UnitSymbol.ft3", "UnitSymbol.charPers", "UnitSymbol.m3Compensated", "UnitSymbol.molPermol", "UnitSymbol.M", "UnitSymbol.onePerHz", "UnitSymbol.JPers", "UnitSymbol.Wh", "UnitSymbol.Gy", "UnitSymbol.gPerg", "UnitSymbol.kgm", "UnitSymbol.kgPerm3"];
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorReset>() {
Some(o) => o, None => continue,
};
if obj.base.unit_symbol.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_symbol.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitSymbol-datatype".to_string(),
class: "AccumulatorReset".to_string(),
property: "Control.unitSymbol".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitSymbol-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_identified_object_description_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "AccumulatorReset".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorReset>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "AccumulatorReset".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_reset_control_time_stamp_datatype(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorReset").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorReset>() {
Some(o) => o, None => continue,
};
if obj.base.time_stamp.is_empty() { continue; }
if !is_xsd_datetime(&obj.base.time_stamp) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.timeStamp-datatype".to_string(),
class: "AccumulatorReset".to_string(),
property: "Control.timeStamp".to_string(),
message: "The datatype is not literal or it violates the xsd datatype.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.timeStamp-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_accumulator_value_accumulator_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorValue>() {
Some(o) => o, None => continue,
};
if obj.accumulator.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AccumulatorValue.Accumulator-cardinality".to_string(),
class: "AccumulatorValue".to_string(),
property: "AccumulatorValue.Accumulator".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "AccumulatorValue.Accumulator-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorValue>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "AccumulatorValue".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorValue>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "AccumulatorValue".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_measurement_value_measurement_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorValue>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.base.measurement_value_source.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["MeasurementValueSource"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.MeasurementValueSource-valueType".to_string(),
class: "AccumulatorValue".to_string(),
property: "MeasurementValue.MeasurementValueSource".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:MeasurementValueSource".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.MeasurementValueSource-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_measurement_value_measurement_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorValue>() {
Some(o) => o, None => continue,
};
if obj.base.measurement_value_source.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.MeasurementValueSource-cardinality".to_string(),
class: "AccumulatorValue".to_string(),
property: "MeasurementValue.MeasurementValueSource".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.MeasurementValueSource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_measurement_value_time_stamp_m_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("MeasurementValue.timeStamp") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.timeStamp-cardinality".to_string(),
class: "AccumulatorValue".to_string(),
property: "MeasurementValue.timeStamp".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.timeStamp-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_identified_object_description_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "AccumulatorValue".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_accumulator_value_accumulator_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorValue>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.accumulator.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["Accumulator"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AccumulatorValue.Accumulator-valueType".to_string(),
class: "AccumulatorValue".to_string(),
property: "AccumulatorValue.Accumulator".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:Accumulator".to_string(),
severity: "sh:Violation".to_string(),
name: "AccumulatorValue.Accumulator-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_measurement_value_sensor_accur_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("MeasurementValue.sensorAccuracy") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.sensorAccuracy-cardinality".to_string(),
class: "AccumulatorValue".to_string(),
property: "MeasurementValue.sensorAccuracy".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.sensorAccuracy-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_accumulator_value_measurement_value_time_stamp_d_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AccumulatorValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AccumulatorValue>() {
Some(o) => o, None => continue,
};
if obj.base.time_stamp.is_empty() { continue; }
if !is_xsd_datetime(&obj.base.time_stamp) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.timeStamp-datatype".to_string(),
class: "AccumulatorValue".to_string(),
property: "MeasurementValue.timeStamp".to_string(),
message: "The datatype is not literal or it violates the xsd datatype.".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.timeStamp-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_phases_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Measurement.phases") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.phases-cardinality".to_string(),
class: "Analog".to_string(),
property: "Measurement.phases".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.phases-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_identified_object_description_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "Analog".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Analog>() {
Some(o) => o, None => continue,
};
if obj.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "Analog".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_phases_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["PhaseCode.CN", "PhaseCode.XY", "PhaseCode.A", "PhaseCode.s12", "PhaseCode.B", "PhaseCode.ABCN", "PhaseCode.C", "PhaseCode.s1N", "PhaseCode.XYN", "PhaseCode.AB", "PhaseCode.X", "PhaseCode.s2N", "PhaseCode.AC", "PhaseCode.s2", "PhaseCode.ABC", "PhaseCode.XN", "PhaseCode.s12N", "PhaseCode.BC", "PhaseCode.AN", "PhaseCode.none", "PhaseCode.ACN", "PhaseCode.s1", "PhaseCode.BN", "PhaseCode.BCN", "PhaseCode.N", "PhaseCode.ABN"];
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Analog>() {
Some(o) => o, None => continue,
};
if obj.base.phases.is_none() { continue; }
if !ALLOWED.contains(&obj.base.phases.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.phases-datatype".to_string(),
class: "Analog".to_string(),
property: "Measurement.phases".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.phases-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_power_system_resource_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Analog>() {
Some(o) => o, None => continue,
};
if obj.base.power_system_resource.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.PowerSystemResource-cardinality".to_string(),
class: "Analog".to_string(),
property: "Measurement.PowerSystemResource".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.PowerSystemResource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_measurement_type_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Analog>() {
Some(o) => o, None => continue,
};
if obj.base.measurement_type.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.measurementType-cardinality".to_string(),
class: "Analog".to_string(),
property: "Measurement.measurementType".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.measurementType-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Analog>() {
Some(o) => o, None => continue,
};
if obj.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "Analog".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_unit_symbol_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitSymbol.WPerm2", "UnitSymbol.molPerkg", "UnitSymbol.HPerm", "UnitSymbol.Ah", "UnitSymbol.N", "UnitSymbol.mPerm3", "UnitSymbol.sPers", "UnitSymbol.mol", "UnitSymbol.m3Uncompensated", "UnitSymbol.VPerV", "UnitSymbol.kgm2", "UnitSymbol.radPers", "UnitSymbol.m3Perkg", "UnitSymbol.SPerm", "UnitSymbol.Wb", "UnitSymbol.bar", "UnitSymbol.kat", "UnitSymbol.V2", "UnitSymbol.cosPhi", "UnitSymbol.Oe", "UnitSymbol.min", "UnitSymbol.Vs", "UnitSymbol.Q", "UnitSymbol.V2h", "UnitSymbol.VA", "UnitSymbol.dBm", "UnitSymbol.CPerkg", "UnitSymbol.Btu", "UnitSymbol.JPerkg", "UnitSymbol.lm", "UnitSymbol.Qh", "UnitSymbol.mPers2", "UnitSymbol.ha", "UnitSymbol.s", "UnitSymbol.rotPers", "UnitSymbol.tonne", "UnitSymbol.NPerm", "UnitSymbol.A", "UnitSymbol.A2", "UnitSymbol.Pa", "UnitSymbol.VAh", "UnitSymbol.none", "UnitSymbol.HzPers", "UnitSymbol.JPerm2", "UnitSymbol.JPerkgK", "UnitSymbol.Nm", "UnitSymbol.deg", "UnitSymbol.S", "UnitSymbol.kgPerJ", "UnitSymbol.As", "UnitSymbol.ohm", "UnitSymbol.A2h", "UnitSymbol.JPerm3", "UnitSymbol.T", "UnitSymbol.m2Pers", "UnitSymbol.onePerm", "UnitSymbol.lx", "UnitSymbol.lPers", "UnitSymbol.d", "UnitSymbol.C", "UnitSymbol.WPersr", "UnitSymbol.JPerK", "UnitSymbol.character", "UnitSymbol.APerA", "UnitSymbol.rad", "UnitSymbol.kg", "UnitSymbol.V", "UnitSymbol.therm", "UnitSymbol.CPerm3", "UnitSymbol.VArh", "UnitSymbol.Mx", "UnitSymbol.ppm", "UnitSymbol.WPerW", "UnitSymbol.JPermolK", "UnitSymbol.WPermK", "UnitSymbol.ohmPerm", "UnitSymbol.cd", "UnitSymbol.WPerm2sr", "UnitSymbol.h", "UnitSymbol.G", "UnitSymbol.VPerm", "UnitSymbol.Bq", "UnitSymbol.F", "UnitSymbol.Vh", "UnitSymbol.W", "UnitSymbol.lPerl", "UnitSymbol.GyPers", "UnitSymbol.HzPerHz", "UnitSymbol.Sv", "UnitSymbol.H", "UnitSymbol.molPerm3", "UnitSymbol.degC", "UnitSymbol.mmHg", "UnitSymbol.JPermol", "UnitSymbol.sr", "UnitSymbol.count", "UnitSymbol.CPerm2", "UnitSymbol.mPers", "UnitSymbol.radPers2", "UnitSymbol.m3Pers", "UnitSymbol.KPers", "UnitSymbol.anglemin", "UnitSymbol.PaPers", "UnitSymbol.VPerHz", "UnitSymbol.ohmm", "UnitSymbol.J", "UnitSymbol.m2", "UnitSymbol.Hz", "UnitSymbol.APerm", "UnitSymbol.m3Perh", "UnitSymbol.rev", "UnitSymbol.WPerA", "UnitSymbol.l", "UnitSymbol.K", "UnitSymbol.m3", "UnitSymbol.katPerm3", "UnitSymbol.WPers", "UnitSymbol.lPerh", "UnitSymbol.dB", "UnitSymbol.m", "UnitSymbol.FPerm", "UnitSymbol.A2s", "UnitSymbol.gal", "UnitSymbol.kn", "UnitSymbol.Pas", "UnitSymbol.VPerVAr", "UnitSymbol.VPerVA", "UnitSymbol.VAr", "UnitSymbol.anglesec", "UnitSymbol.ft3", "UnitSymbol.charPers", "UnitSymbol.m3Compensated", "UnitSymbol.molPermol", "UnitSymbol.M", "UnitSymbol.onePerHz", "UnitSymbol.JPers", "UnitSymbol.Wh", "UnitSymbol.Gy", "UnitSymbol.gPerg", "UnitSymbol.kgm", "UnitSymbol.kgPerm3"];
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Analog>() {
Some(o) => o, None => continue,
};
if obj.base.unit_symbol.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_symbol.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitSymbol-datatype".to_string(),
class: "Analog".to_string(),
property: "Measurement.unitSymbol".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitSymbol-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_terminal_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Measurement.Terminal") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.Terminal-cardinality".to_string(),
class: "Analog".to_string(),
property: "Measurement.Terminal".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.Terminal-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_analog_positive_flow_in_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Analog.positiveFlowIn") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Analog.positiveFlowIn-cardinality".to_string(),
class: "Analog".to_string(),
property: "Analog.positiveFlowIn".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Analog.positiveFlowIn-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_unit_multiplier_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitMultiplier.k", "UnitMultiplier.da", "UnitMultiplier.Z", "UnitMultiplier.y", "UnitMultiplier.micro", "UnitMultiplier.Y", "UnitMultiplier.z", "UnitMultiplier.G", "UnitMultiplier.h", "UnitMultiplier.T", "UnitMultiplier.E", "UnitMultiplier.f", "UnitMultiplier.c", "UnitMultiplier.none", "UnitMultiplier.d", "UnitMultiplier.a", "UnitMultiplier.P", "UnitMultiplier.p", "UnitMultiplier.m", "UnitMultiplier.M", "UnitMultiplier.n"];
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Analog>() {
Some(o) => o, None => continue,
};
if obj.base.unit_multiplier.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_multiplier.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitMultiplier-datatype".to_string(),
class: "Analog".to_string(),
property: "Measurement.unitMultiplier".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitMultiplier-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_unit_multiplier_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Analog>() {
Some(o) => o, None => continue,
};
if obj.base.unit_multiplier.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitMultiplier-cardinality".to_string(),
class: "Analog".to_string(),
property: "Measurement.unitMultiplier".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitMultiplier-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_measurement_unit_symbol_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Analog").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Analog>() {
Some(o) => o, None => continue,
};
if obj.base.unit_symbol.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitSymbol-cardinality".to_string(),
class: "Analog".to_string(),
property: "Measurement.unitSymbol".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitSymbol-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_identified_object_description_max_c_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimit").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "AnalogLimit".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimit").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogLimit>() {
Some(o) => o, None => continue,
};
if obj.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "AnalogLimit".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_analog_limit_value_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimit").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogLimit>() {
Some(o) => o, None => continue,
};
if obj.value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogLimit.value-cardinality".to_string(),
class: "AnalogLimit".to_string(),
property: "AnalogLimit.value".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogLimit.value-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimit").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogLimit>() {
Some(o) => o, None => continue,
};
if obj.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "AnalogLimit".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_analog_limit_limit_set_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimit").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogLimit>() {
Some(o) => o, None => continue,
};
if obj.limit_set.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogLimit.LimitSet-cardinality".to_string(),
class: "AnalogLimit".to_string(),
property: "AnalogLimit.LimitSet".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogLimit.LimitSet-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_analog_limit_limit_set_has_value(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimit").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogLimit>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.limit_set.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["AnalogLimitSet"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogLimit.LimitSet-valueType".to_string(),
class: "AnalogLimit".to_string(),
property: "AnalogLimit.LimitSet".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:AnalogLimitSet".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogLimit.LimitSet-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimitSet").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogLimitSet>() {
Some(o) => o, None => continue,
};
if obj.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "AnalogLimitSet".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_analog_limit_set_measurements_h_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimitSet").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogLimitSet>() {
Some(o) => o, None => continue,
};
for r in &obj.measurements {
let ref_id = r.mrid.trim_start_matches('#');
if ref_id.is_empty() { continue; }
if let Some(ref_entry) = dataset.entries.get(ref_id) {
let allowed: &[&str] = &["Analog"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogLimitSet.Measurements-valueType".to_string(),
class: "AnalogLimitSet".to_string(),
property: "AnalogLimitSet.Measurements".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:Analog".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogLimitSet.Measurements-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_limit_set_is_percentage_limits_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimitSet").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("LimitSet.isPercentageLimits") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:LimitSet.isPercentageLimits-cardinality".to_string(),
class: "AnalogLimitSet".to_string(),
property: "LimitSet.isPercentageLimits".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "LimitSet.isPercentageLimits-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimitSet").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogLimitSet>() {
Some(o) => o, None => continue,
};
if obj.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "AnalogLimitSet".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_identified_object_description_m_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimitSet").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "AnalogLimitSet".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_limit_set_analog_limit_set_measurements_m_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogLimitSet").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogLimitSet>() {
Some(o) => o, None => continue,
};
if obj.measurements.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogLimitSet.Measurements-cardinality".to_string(),
class: "AnalogLimitSet".to_string(),
property: "AnalogLimitSet.Measurements".to_string(),
message: "Cardinality violation. Lower bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogLimitSet.Measurements-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_measurement_value_sensor_accuracy_m_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("MeasurementValue.sensorAccuracy") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.sensorAccuracy-cardinality".to_string(),
class: "AnalogValue".to_string(),
property: "MeasurementValue.sensorAccuracy".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.sensorAccuracy-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_measurement_value_measurement_value_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogValue>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.base.measurement_value_source.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["MeasurementValueSource"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.MeasurementValueSource-valueType".to_string(),
class: "AnalogValue".to_string(),
property: "MeasurementValue.MeasurementValueSource".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:MeasurementValueSource".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.MeasurementValueSource-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogValue>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "AnalogValue".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_measurement_value_time_stamp_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("MeasurementValue.timeStamp") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.timeStamp-cardinality".to_string(),
class: "AnalogValue".to_string(),
property: "MeasurementValue.timeStamp".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.timeStamp-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_measurement_value_time_stamp_datatype(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogValue>() {
Some(o) => o, None => continue,
};
if obj.base.time_stamp.is_empty() { continue; }
if !is_xsd_datetime(&obj.base.time_stamp) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.timeStamp-datatype".to_string(),
class: "AnalogValue".to_string(),
property: "MeasurementValue.timeStamp".to_string(),
message: "The datatype is not literal or it violates the xsd datatype.".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.timeStamp-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_identified_object_description_max_c_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "AnalogValue".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_analog_value_analog_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogValue>() {
Some(o) => o, None => continue,
};
if obj.analog.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogValue.Analog-cardinality".to_string(),
class: "AnalogValue".to_string(),
property: "AnalogValue.Analog".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogValue.Analog-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_measurement_value_measurement_value_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogValue>() {
Some(o) => o, None => continue,
};
if obj.base.measurement_value_source.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.MeasurementValueSource-cardinality".to_string(),
class: "AnalogValue".to_string(),
property: "MeasurementValue.MeasurementValueSource".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.MeasurementValueSource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogValue>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "AnalogValue".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_analog_value_analog_value_analog_has_value(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("AnalogValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::AnalogValue>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.analog.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["Analog"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogValue.Analog-valueType".to_string(),
class: "AnalogValue".to_string(),
property: "AnalogValue.Analog".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:Analog".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogValue.Analog-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_command_value_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Command>() {
Some(o) => o, None => continue,
};
if obj.value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Command.value-cardinality".to_string(),
class: "Command".to_string(),
property: "Command.value".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Command.value-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_control_unit_symbol_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitSymbol.WPerm2", "UnitSymbol.molPerkg", "UnitSymbol.HPerm", "UnitSymbol.Ah", "UnitSymbol.N", "UnitSymbol.mPerm3", "UnitSymbol.sPers", "UnitSymbol.mol", "UnitSymbol.m3Uncompensated", "UnitSymbol.VPerV", "UnitSymbol.kgm2", "UnitSymbol.radPers", "UnitSymbol.m3Perkg", "UnitSymbol.SPerm", "UnitSymbol.Wb", "UnitSymbol.bar", "UnitSymbol.kat", "UnitSymbol.V2", "UnitSymbol.cosPhi", "UnitSymbol.Oe", "UnitSymbol.min", "UnitSymbol.Vs", "UnitSymbol.Q", "UnitSymbol.V2h", "UnitSymbol.VA", "UnitSymbol.dBm", "UnitSymbol.CPerkg", "UnitSymbol.Btu", "UnitSymbol.JPerkg", "UnitSymbol.lm", "UnitSymbol.Qh", "UnitSymbol.mPers2", "UnitSymbol.ha", "UnitSymbol.s", "UnitSymbol.rotPers", "UnitSymbol.tonne", "UnitSymbol.NPerm", "UnitSymbol.A", "UnitSymbol.A2", "UnitSymbol.Pa", "UnitSymbol.VAh", "UnitSymbol.none", "UnitSymbol.HzPers", "UnitSymbol.JPerm2", "UnitSymbol.JPerkgK", "UnitSymbol.Nm", "UnitSymbol.deg", "UnitSymbol.S", "UnitSymbol.kgPerJ", "UnitSymbol.As", "UnitSymbol.ohm", "UnitSymbol.A2h", "UnitSymbol.JPerm3", "UnitSymbol.T", "UnitSymbol.m2Pers", "UnitSymbol.onePerm", "UnitSymbol.lx", "UnitSymbol.lPers", "UnitSymbol.d", "UnitSymbol.C", "UnitSymbol.WPersr", "UnitSymbol.JPerK", "UnitSymbol.character", "UnitSymbol.APerA", "UnitSymbol.rad", "UnitSymbol.kg", "UnitSymbol.V", "UnitSymbol.therm", "UnitSymbol.CPerm3", "UnitSymbol.VArh", "UnitSymbol.Mx", "UnitSymbol.ppm", "UnitSymbol.WPerW", "UnitSymbol.JPermolK", "UnitSymbol.WPermK", "UnitSymbol.ohmPerm", "UnitSymbol.cd", "UnitSymbol.WPerm2sr", "UnitSymbol.h", "UnitSymbol.G", "UnitSymbol.VPerm", "UnitSymbol.Bq", "UnitSymbol.F", "UnitSymbol.Vh", "UnitSymbol.W", "UnitSymbol.lPerl", "UnitSymbol.GyPers", "UnitSymbol.HzPerHz", "UnitSymbol.Sv", "UnitSymbol.H", "UnitSymbol.molPerm3", "UnitSymbol.degC", "UnitSymbol.mmHg", "UnitSymbol.JPermol", "UnitSymbol.sr", "UnitSymbol.count", "UnitSymbol.CPerm2", "UnitSymbol.mPers", "UnitSymbol.radPers2", "UnitSymbol.m3Pers", "UnitSymbol.KPers", "UnitSymbol.anglemin", "UnitSymbol.PaPers", "UnitSymbol.VPerHz", "UnitSymbol.ohmm", "UnitSymbol.J", "UnitSymbol.m2", "UnitSymbol.Hz", "UnitSymbol.APerm", "UnitSymbol.m3Perh", "UnitSymbol.rev", "UnitSymbol.WPerA", "UnitSymbol.l", "UnitSymbol.K", "UnitSymbol.m3", "UnitSymbol.katPerm3", "UnitSymbol.WPers", "UnitSymbol.lPerh", "UnitSymbol.dB", "UnitSymbol.m", "UnitSymbol.FPerm", "UnitSymbol.A2s", "UnitSymbol.gal", "UnitSymbol.kn", "UnitSymbol.Pas", "UnitSymbol.VPerVAr", "UnitSymbol.VPerVA", "UnitSymbol.VAr", "UnitSymbol.anglesec", "UnitSymbol.ft3", "UnitSymbol.charPers", "UnitSymbol.m3Compensated", "UnitSymbol.molPermol", "UnitSymbol.M", "UnitSymbol.onePerHz", "UnitSymbol.JPers", "UnitSymbol.Wh", "UnitSymbol.Gy", "UnitSymbol.gPerg", "UnitSymbol.kgm", "UnitSymbol.kgPerm3"];
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Command>() {
Some(o) => o, None => continue,
};
if obj.base.unit_symbol.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_symbol.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitSymbol-datatype".to_string(),
class: "Command".to_string(),
property: "Control.unitSymbol".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitSymbol-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_control_power_system_resource_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.PowerSystemResource") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.PowerSystemResource-cardinality".to_string(),
class: "Command".to_string(),
property: "Control.PowerSystemResource".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.PowerSystemResource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_control_operation_in_progress_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.operationInProgress") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.operationInProgress-cardinality".to_string(),
class: "Command".to_string(),
property: "Control.operationInProgress".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.operationInProgress-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_control_time_stamp_datatype(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Command>() {
Some(o) => o, None => continue,
};
if obj.base.time_stamp.is_empty() { continue; }
if !is_xsd_datetime(&obj.base.time_stamp) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.timeStamp-datatype".to_string(),
class: "Command".to_string(),
property: "Control.timeStamp".to_string(),
message: "The datatype is not literal or it violates the xsd datatype.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.timeStamp-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_control_control_type_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Command>() {
Some(o) => o, None => continue,
};
if obj.base.control_type.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.controlType-cardinality".to_string(),
class: "Command".to_string(),
property: "Control.controlType".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.controlType-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_identified_object_description_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "Command".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Command>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "Command".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_control_time_stamp_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.timeStamp") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.timeStamp-cardinality".to_string(),
class: "Command".to_string(),
property: "Control.timeStamp".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.timeStamp-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_command_value_alias_set_has_value(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Command>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.value_alias_set.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["ValueAliasSet"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Command.ValueAliasSet-valueType".to_string(),
class: "Command".to_string(),
property: "Command.ValueAliasSet".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:ValueAliasSet".to_string(),
severity: "sh:Violation".to_string(),
name: "Command.ValueAliasSet-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_control_unit_multiplier_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.unitMultiplier") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitMultiplier-cardinality".to_string(),
class: "Command".to_string(),
property: "Control.unitMultiplier".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitMultiplier-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_command_value_alias_set_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Command.ValueAliasSet") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Command.ValueAliasSet-cardinality".to_string(),
class: "Command".to_string(),
property: "Command.ValueAliasSet".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Command.ValueAliasSet-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_control_unit_symbol_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.unitSymbol") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitSymbol-cardinality".to_string(),
class: "Command".to_string(),
property: "Control.unitSymbol".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitSymbol-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_command_normal_value_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Command>() {
Some(o) => o, None => continue,
};
if obj.normal_value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Command.normalValue-cardinality".to_string(),
class: "Command".to_string(),
property: "Command.normalValue".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Command.normalValue-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_command_discrete_value_has_value(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Command>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.discrete_value.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["DiscreteValue"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Command.DiscreteValue-valueType".to_string(),
class: "Command".to_string(),
property: "Command.DiscreteValue".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:DiscreteValue".to_string(),
severity: "sh:Violation".to_string(),
name: "Command.DiscreteValue-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_command_discrete_value_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Command>() {
Some(o) => o, None => continue,
};
if obj.discrete_value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Command.DiscreteValue-cardinality".to_string(),
class: "Command".to_string(),
property: "Command.DiscreteValue".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "Command.DiscreteValue-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Command>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "Command".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_command_control_unit_multiplier_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitMultiplier.k", "UnitMultiplier.da", "UnitMultiplier.Z", "UnitMultiplier.y", "UnitMultiplier.micro", "UnitMultiplier.Y", "UnitMultiplier.z", "UnitMultiplier.G", "UnitMultiplier.h", "UnitMultiplier.T", "UnitMultiplier.E", "UnitMultiplier.f", "UnitMultiplier.c", "UnitMultiplier.none", "UnitMultiplier.d", "UnitMultiplier.a", "UnitMultiplier.P", "UnitMultiplier.p", "UnitMultiplier.m", "UnitMultiplier.M", "UnitMultiplier.n"];
for mrid in dataset.by_type.get("Command").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Command>() {
Some(o) => o, None => continue,
};
if obj.base.unit_multiplier.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_multiplier.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitMultiplier-datatype".to_string(),
class: "Command".to_string(),
property: "Control.unitMultiplier".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitMultiplier-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_unit_symbol_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitSymbol.WPerm2", "UnitSymbol.molPerkg", "UnitSymbol.HPerm", "UnitSymbol.Ah", "UnitSymbol.N", "UnitSymbol.mPerm3", "UnitSymbol.sPers", "UnitSymbol.mol", "UnitSymbol.m3Uncompensated", "UnitSymbol.VPerV", "UnitSymbol.kgm2", "UnitSymbol.radPers", "UnitSymbol.m3Perkg", "UnitSymbol.SPerm", "UnitSymbol.Wb", "UnitSymbol.bar", "UnitSymbol.kat", "UnitSymbol.V2", "UnitSymbol.cosPhi", "UnitSymbol.Oe", "UnitSymbol.min", "UnitSymbol.Vs", "UnitSymbol.Q", "UnitSymbol.V2h", "UnitSymbol.VA", "UnitSymbol.dBm", "UnitSymbol.CPerkg", "UnitSymbol.Btu", "UnitSymbol.JPerkg", "UnitSymbol.lm", "UnitSymbol.Qh", "UnitSymbol.mPers2", "UnitSymbol.ha", "UnitSymbol.s", "UnitSymbol.rotPers", "UnitSymbol.tonne", "UnitSymbol.NPerm", "UnitSymbol.A", "UnitSymbol.A2", "UnitSymbol.Pa", "UnitSymbol.VAh", "UnitSymbol.none", "UnitSymbol.HzPers", "UnitSymbol.JPerm2", "UnitSymbol.JPerkgK", "UnitSymbol.Nm", "UnitSymbol.deg", "UnitSymbol.S", "UnitSymbol.kgPerJ", "UnitSymbol.As", "UnitSymbol.ohm", "UnitSymbol.A2h", "UnitSymbol.JPerm3", "UnitSymbol.T", "UnitSymbol.m2Pers", "UnitSymbol.onePerm", "UnitSymbol.lx", "UnitSymbol.lPers", "UnitSymbol.d", "UnitSymbol.C", "UnitSymbol.WPersr", "UnitSymbol.JPerK", "UnitSymbol.character", "UnitSymbol.APerA", "UnitSymbol.rad", "UnitSymbol.kg", "UnitSymbol.V", "UnitSymbol.therm", "UnitSymbol.CPerm3", "UnitSymbol.VArh", "UnitSymbol.Mx", "UnitSymbol.ppm", "UnitSymbol.WPerW", "UnitSymbol.JPermolK", "UnitSymbol.WPermK", "UnitSymbol.ohmPerm", "UnitSymbol.cd", "UnitSymbol.WPerm2sr", "UnitSymbol.h", "UnitSymbol.G", "UnitSymbol.VPerm", "UnitSymbol.Bq", "UnitSymbol.F", "UnitSymbol.Vh", "UnitSymbol.W", "UnitSymbol.lPerl", "UnitSymbol.GyPers", "UnitSymbol.HzPerHz", "UnitSymbol.Sv", "UnitSymbol.H", "UnitSymbol.molPerm3", "UnitSymbol.degC", "UnitSymbol.mmHg", "UnitSymbol.JPermol", "UnitSymbol.sr", "UnitSymbol.count", "UnitSymbol.CPerm2", "UnitSymbol.mPers", "UnitSymbol.radPers2", "UnitSymbol.m3Pers", "UnitSymbol.KPers", "UnitSymbol.anglemin", "UnitSymbol.PaPers", "UnitSymbol.VPerHz", "UnitSymbol.ohmm", "UnitSymbol.J", "UnitSymbol.m2", "UnitSymbol.Hz", "UnitSymbol.APerm", "UnitSymbol.m3Perh", "UnitSymbol.rev", "UnitSymbol.WPerA", "UnitSymbol.l", "UnitSymbol.K", "UnitSymbol.m3", "UnitSymbol.katPerm3", "UnitSymbol.WPers", "UnitSymbol.lPerh", "UnitSymbol.dB", "UnitSymbol.m", "UnitSymbol.FPerm", "UnitSymbol.A2s", "UnitSymbol.gal", "UnitSymbol.kn", "UnitSymbol.Pas", "UnitSymbol.VPerVAr", "UnitSymbol.VPerVA", "UnitSymbol.VAr", "UnitSymbol.anglesec", "UnitSymbol.ft3", "UnitSymbol.charPers", "UnitSymbol.m3Compensated", "UnitSymbol.molPermol", "UnitSymbol.M", "UnitSymbol.onePerHz", "UnitSymbol.JPers", "UnitSymbol.Wh", "UnitSymbol.Gy", "UnitSymbol.gPerg", "UnitSymbol.kgm", "UnitSymbol.kgPerm3"];
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Discrete>() {
Some(o) => o, None => continue,
};
if obj.base.unit_symbol.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_symbol.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitSymbol-datatype".to_string(),
class: "Discrete".to_string(),
property: "Measurement.unitSymbol".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitSymbol-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Discrete>() {
Some(o) => o, None => continue,
};
if obj.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "Discrete".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_unit_symbol_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Discrete>() {
Some(o) => o, None => continue,
};
if obj.base.unit_symbol.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitSymbol-cardinality".to_string(),
class: "Discrete".to_string(),
property: "Measurement.unitSymbol".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitSymbol-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_phases_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Measurement.phases") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.phases-cardinality".to_string(),
class: "Discrete".to_string(),
property: "Measurement.phases".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.phases-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_discrete_value_alias_set_has_value(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Discrete>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.value_alias_set.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["ValueAliasSet"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Discrete.ValueAliasSet-valueType".to_string(),
class: "Discrete".to_string(),
property: "Discrete.ValueAliasSet".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:ValueAliasSet".to_string(),
severity: "sh:Violation".to_string(),
name: "Discrete.ValueAliasSet-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Discrete>() {
Some(o) => o, None => continue,
};
if obj.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "Discrete".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_unit_multiplier_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Discrete>() {
Some(o) => o, None => continue,
};
if obj.base.unit_multiplier.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitMultiplier-cardinality".to_string(),
class: "Discrete".to_string(),
property: "Measurement.unitMultiplier".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitMultiplier-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_phases_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["PhaseCode.CN", "PhaseCode.XY", "PhaseCode.A", "PhaseCode.s12", "PhaseCode.B", "PhaseCode.ABCN", "PhaseCode.C", "PhaseCode.s1N", "PhaseCode.XYN", "PhaseCode.AB", "PhaseCode.X", "PhaseCode.s2N", "PhaseCode.AC", "PhaseCode.s2", "PhaseCode.ABC", "PhaseCode.XN", "PhaseCode.s12N", "PhaseCode.BC", "PhaseCode.AN", "PhaseCode.none", "PhaseCode.ACN", "PhaseCode.s1", "PhaseCode.BN", "PhaseCode.BCN", "PhaseCode.N", "PhaseCode.ABN"];
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Discrete>() {
Some(o) => o, None => continue,
};
if obj.base.phases.is_none() { continue; }
if !ALLOWED.contains(&obj.base.phases.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.phases-datatype".to_string(),
class: "Discrete".to_string(),
property: "Measurement.phases".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.phases-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_terminal_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Measurement.Terminal") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.Terminal-cardinality".to_string(),
class: "Discrete".to_string(),
property: "Measurement.Terminal".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.Terminal-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_identified_object_description_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "Discrete".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_discrete_value_alias_set_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Discrete.ValueAliasSet") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Discrete.ValueAliasSet-cardinality".to_string(),
class: "Discrete".to_string(),
property: "Discrete.ValueAliasSet".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Discrete.ValueAliasSet-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_power_system_resource_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Discrete>() {
Some(o) => o, None => continue,
};
if obj.base.power_system_resource.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.PowerSystemResource-cardinality".to_string(),
class: "Discrete".to_string(),
property: "Measurement.PowerSystemResource".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.PowerSystemResource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_measurement_type_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Discrete>() {
Some(o) => o, None => continue,
};
if obj.base.measurement_type.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.measurementType-cardinality".to_string(),
class: "Discrete".to_string(),
property: "Measurement.measurementType".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.measurementType-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_measurement_unit_multiplier_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitMultiplier.k", "UnitMultiplier.da", "UnitMultiplier.Z", "UnitMultiplier.y", "UnitMultiplier.micro", "UnitMultiplier.Y", "UnitMultiplier.z", "UnitMultiplier.G", "UnitMultiplier.h", "UnitMultiplier.T", "UnitMultiplier.E", "UnitMultiplier.f", "UnitMultiplier.c", "UnitMultiplier.none", "UnitMultiplier.d", "UnitMultiplier.a", "UnitMultiplier.P", "UnitMultiplier.p", "UnitMultiplier.m", "UnitMultiplier.M", "UnitMultiplier.n"];
for mrid in dataset.by_type.get("Discrete").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::Discrete>() {
Some(o) => o, None => continue,
};
if obj.base.unit_multiplier.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_multiplier.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitMultiplier-datatype".to_string(),
class: "Discrete".to_string(),
property: "Measurement.unitMultiplier".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitMultiplier-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_measurement_value_sensor_accuracy_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("DiscreteValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("MeasurementValue.sensorAccuracy") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.sensorAccuracy-cardinality".to_string(),
class: "DiscreteValue".to_string(),
property: "MeasurementValue.sensorAccuracy".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.sensorAccuracy-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_discrete_value_discrete_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("DiscreteValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::DiscreteValue>() {
Some(o) => o, None => continue,
};
if obj.discrete.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:DiscreteValue.Discrete-cardinality".to_string(),
class: "DiscreteValue".to_string(),
property: "DiscreteValue.Discrete".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "DiscreteValue.Discrete-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_measurement_value_time_stamp_data_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("DiscreteValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::DiscreteValue>() {
Some(o) => o, None => continue,
};
if obj.base.time_stamp.is_empty() { continue; }
if !is_xsd_datetime(&obj.base.time_stamp) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.timeStamp-datatype".to_string(),
class: "DiscreteValue".to_string(),
property: "MeasurementValue.timeStamp".to_string(),
message: "The datatype is not literal or it violates the xsd datatype.".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.timeStamp-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_measurement_value_measurement_val_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("DiscreteValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::DiscreteValue>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.base.measurement_value_source.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["MeasurementValueSource"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.MeasurementValueSource-valueType".to_string(),
class: "DiscreteValue".to_string(),
property: "MeasurementValue.MeasurementValueSource".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:MeasurementValueSource".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.MeasurementValueSource-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_measurement_value_measurement_val_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("DiscreteValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::DiscreteValue>() {
Some(o) => o, None => continue,
};
if obj.base.measurement_value_source.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.MeasurementValueSource-cardinality".to_string(),
class: "DiscreteValue".to_string(),
property: "MeasurementValue.MeasurementValueSource".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.MeasurementValueSource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_discrete_value_discrete_has_value(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("DiscreteValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::DiscreteValue>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.discrete.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["Discrete"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:DiscreteValue.Discrete-valueType".to_string(),
class: "DiscreteValue".to_string(),
property: "DiscreteValue.Discrete".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:Discrete".to_string(),
severity: "sh:Violation".to_string(),
name: "DiscreteValue.Discrete-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_measurement_value_time_stamp_max_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("DiscreteValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("MeasurementValue.timeStamp") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.timeStamp-cardinality".to_string(),
class: "DiscreteValue".to_string(),
property: "MeasurementValue.timeStamp".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.timeStamp-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_identified_object_description_max_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("DiscreteValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "DiscreteValue".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("DiscreteValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::DiscreteValue>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "DiscreteValue".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_discrete_value_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("DiscreteValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::DiscreteValue>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "DiscreteValue".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_validity_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.validity") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.validity-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.validity".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.validity-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_test_max_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.test") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.test-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.test".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.test-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_suspect_m_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.suspect") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.suspect-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.suspect".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.suspect-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_operator_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.operatorBlocked") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.operatorBlocked-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.operatorBlocked".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.operatorBlocked-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_oscillato_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.oscillatory") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.oscillatory-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.oscillatory".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.oscillatory-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_source_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["Source.SUBSTITUTED", "Source.PROCESS", "Source.DEFAULTED"];
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::MeasurementValueQuality>() {
Some(o) => o, None => continue,
};
if obj.base.source.is_none() { continue; }
if !ALLOWED.contains(&obj.base.source.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.source-datatype".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.source".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.source-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_bad_refer_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.badReference") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.badReference-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.badReference".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.badReference-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_validity_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["Validity.INVALID", "Validity.GOOD", "Validity.QUESTIONABLE"];
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::MeasurementValueQuality>() {
Some(o) => o, None => continue,
};
if obj.base.validity.is_none() { continue; }
if !ALLOWED.contains(&obj.base.validity.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.validity-datatype".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.validity".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.validity-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_old_data_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.oldData") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.oldData-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.oldData".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.oldData-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_failure_m_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.failure") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.failure-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.failure".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.failure-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_measurement_value_qual_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::MeasurementValueQuality>() {
Some(o) => o, None => continue,
};
if obj.measurement_value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValueQuality.MeasurementValue-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "MeasurementValueQuality.MeasurementValue".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValueQuality.MeasurementValue-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_estimator_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.estimatorReplaced") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.estimatorReplaced-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.estimatorReplaced".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.estimatorReplaced-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_out_of_ra_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.outOfRange") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.outOfRange-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.outOfRange".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.outOfRange-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_source_ma_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.source") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.source-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.source".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.source-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_quality61850_over_flow_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Quality61850.overFlow") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Quality61850.overFlow-cardinality".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "Quality61850.overFlow".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Quality61850.overFlow-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_quality_measurement_value_qual_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueQuality").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::MeasurementValueQuality>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.measurement_value.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["AnalogValue", "AccumulatorValue", "DiscreteValue", "StringMeasurementValue"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValueQuality.MeasurementValue-valueType".to_string(),
class: "MeasurementValueQuality".to_string(),
property: "MeasurementValueQuality.MeasurementValue".to_string(),
message: "One of the following occurs: 1) The value type is not IRI; 2) The value type is not the right class.".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValueQuality.MeasurementValue-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_source_identified_object_name_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueSource").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::MeasurementValueSource>() {
Some(o) => o, None => continue,
};
if obj.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "MeasurementValueSource".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_source_identified_object_m_rid_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueSource").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::MeasurementValueSource>() {
Some(o) => o, None => continue,
};
if obj.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "MeasurementValueSource".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_measurement_value_source_identified_object_descr_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("MeasurementValueSource").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "MeasurementValueSource".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_raise_lower_command_value_al_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("RaiseLowerCommand.ValueAliasSet") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:RaiseLowerCommand.ValueAliasSet-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "RaiseLowerCommand.ValueAliasSet".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "RaiseLowerCommand.ValueAliasSet-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_analog_control_min_value_req_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::RaiseLowerCommand>() {
Some(o) => o, None => continue,
};
if obj.base.min_value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogControl.minValue-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "AnalogControl.minValue".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogControl.minValue-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_analog_control_analog_value_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::RaiseLowerCommand>() {
Some(o) => o, None => continue,
};
if obj.base.analog_value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogControl.AnalogValue-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "AnalogControl.AnalogValue".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogControl.AnalogValue-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_operation_in_progres_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.operationInProgress") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.operationInProgress-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "Control.operationInProgress".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.operationInProgress-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_control_type_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::RaiseLowerCommand>() {
Some(o) => o, None => continue,
};
if obj.base.base.control_type.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.controlType-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "Control.controlType".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.controlType-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::RaiseLowerCommand>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_time_stamp_datatype(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::RaiseLowerCommand>() {
Some(o) => o, None => continue,
};
if obj.base.base.time_stamp.is_empty() { continue; }
if !is_xsd_datetime(&obj.base.base.time_stamp) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.timeStamp-datatype".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "Control.timeStamp".to_string(),
message: "The datatype is not literal or it violates the xsd datatype.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.timeStamp-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_identified_object_descriptio_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_identified_object_m_rid_requ_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::RaiseLowerCommand>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_analog_control_analog_value_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::RaiseLowerCommand>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.base.analog_value.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["AnalogValue"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogControl.AnalogValue-valueType".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "AnalogControl.AnalogValue".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:AnalogValue".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogControl.AnalogValue-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_analog_control_max_value_req_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::RaiseLowerCommand>() {
Some(o) => o, None => continue,
};
if obj.base.max_value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogControl.maxValue-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "AnalogControl.maxValue".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogControl.maxValue-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_time_stamp_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.timeStamp") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.timeStamp-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "Control.timeStamp".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.timeStamp-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_power_system_resourc_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.PowerSystemResource") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.PowerSystemResource-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "Control.PowerSystemResource".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.PowerSystemResource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_raise_lower_command_value_al_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::RaiseLowerCommand>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.value_alias_set.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["ValueAliasSet"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:RaiseLowerCommand.ValueAliasSet-valueType".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "RaiseLowerCommand.ValueAliasSet".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:ValueAliasSet".to_string(),
severity: "sh:Violation".to_string(),
name: "RaiseLowerCommand.ValueAliasSet-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_unit_multiplier_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitMultiplier.k", "UnitMultiplier.da", "UnitMultiplier.Z", "UnitMultiplier.y", "UnitMultiplier.micro", "UnitMultiplier.Y", "UnitMultiplier.z", "UnitMultiplier.G", "UnitMultiplier.h", "UnitMultiplier.T", "UnitMultiplier.E", "UnitMultiplier.f", "UnitMultiplier.c", "UnitMultiplier.none", "UnitMultiplier.d", "UnitMultiplier.a", "UnitMultiplier.P", "UnitMultiplier.p", "UnitMultiplier.m", "UnitMultiplier.M", "UnitMultiplier.n"];
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::RaiseLowerCommand>() {
Some(o) => o, None => continue,
};
if obj.base.base.unit_multiplier.is_none() { continue; }
if !ALLOWED.contains(&obj.base.base.unit_multiplier.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitMultiplier-datatype".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "Control.unitMultiplier".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitMultiplier-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_unit_multiplier_max_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.unitMultiplier") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitMultiplier-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "Control.unitMultiplier".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitMultiplier-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_unit_symbol_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.unitSymbol") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitSymbol-cardinality".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "Control.unitSymbol".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitSymbol-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_raise_lower_command_control_unit_symbol_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitSymbol.WPerm2", "UnitSymbol.molPerkg", "UnitSymbol.HPerm", "UnitSymbol.Ah", "UnitSymbol.N", "UnitSymbol.mPerm3", "UnitSymbol.sPers", "UnitSymbol.mol", "UnitSymbol.m3Uncompensated", "UnitSymbol.VPerV", "UnitSymbol.kgm2", "UnitSymbol.radPers", "UnitSymbol.m3Perkg", "UnitSymbol.SPerm", "UnitSymbol.Wb", "UnitSymbol.bar", "UnitSymbol.kat", "UnitSymbol.V2", "UnitSymbol.cosPhi", "UnitSymbol.Oe", "UnitSymbol.min", "UnitSymbol.Vs", "UnitSymbol.Q", "UnitSymbol.V2h", "UnitSymbol.VA", "UnitSymbol.dBm", "UnitSymbol.CPerkg", "UnitSymbol.Btu", "UnitSymbol.JPerkg", "UnitSymbol.lm", "UnitSymbol.Qh", "UnitSymbol.mPers2", "UnitSymbol.ha", "UnitSymbol.s", "UnitSymbol.rotPers", "UnitSymbol.tonne", "UnitSymbol.NPerm", "UnitSymbol.A", "UnitSymbol.A2", "UnitSymbol.Pa", "UnitSymbol.VAh", "UnitSymbol.none", "UnitSymbol.HzPers", "UnitSymbol.JPerm2", "UnitSymbol.JPerkgK", "UnitSymbol.Nm", "UnitSymbol.deg", "UnitSymbol.S", "UnitSymbol.kgPerJ", "UnitSymbol.As", "UnitSymbol.ohm", "UnitSymbol.A2h", "UnitSymbol.JPerm3", "UnitSymbol.T", "UnitSymbol.m2Pers", "UnitSymbol.onePerm", "UnitSymbol.lx", "UnitSymbol.lPers", "UnitSymbol.d", "UnitSymbol.C", "UnitSymbol.WPersr", "UnitSymbol.JPerK", "UnitSymbol.character", "UnitSymbol.APerA", "UnitSymbol.rad", "UnitSymbol.kg", "UnitSymbol.V", "UnitSymbol.therm", "UnitSymbol.CPerm3", "UnitSymbol.VArh", "UnitSymbol.Mx", "UnitSymbol.ppm", "UnitSymbol.WPerW", "UnitSymbol.JPermolK", "UnitSymbol.WPermK", "UnitSymbol.ohmPerm", "UnitSymbol.cd", "UnitSymbol.WPerm2sr", "UnitSymbol.h", "UnitSymbol.G", "UnitSymbol.VPerm", "UnitSymbol.Bq", "UnitSymbol.F", "UnitSymbol.Vh", "UnitSymbol.W", "UnitSymbol.lPerl", "UnitSymbol.GyPers", "UnitSymbol.HzPerHz", "UnitSymbol.Sv", "UnitSymbol.H", "UnitSymbol.molPerm3", "UnitSymbol.degC", "UnitSymbol.mmHg", "UnitSymbol.JPermol", "UnitSymbol.sr", "UnitSymbol.count", "UnitSymbol.CPerm2", "UnitSymbol.mPers", "UnitSymbol.radPers2", "UnitSymbol.m3Pers", "UnitSymbol.KPers", "UnitSymbol.anglemin", "UnitSymbol.PaPers", "UnitSymbol.VPerHz", "UnitSymbol.ohmm", "UnitSymbol.J", "UnitSymbol.m2", "UnitSymbol.Hz", "UnitSymbol.APerm", "UnitSymbol.m3Perh", "UnitSymbol.rev", "UnitSymbol.WPerA", "UnitSymbol.l", "UnitSymbol.K", "UnitSymbol.m3", "UnitSymbol.katPerm3", "UnitSymbol.WPers", "UnitSymbol.lPerh", "UnitSymbol.dB", "UnitSymbol.m", "UnitSymbol.FPerm", "UnitSymbol.A2s", "UnitSymbol.gal", "UnitSymbol.kn", "UnitSymbol.Pas", "UnitSymbol.VPerVAr", "UnitSymbol.VPerVA", "UnitSymbol.VAr", "UnitSymbol.anglesec", "UnitSymbol.ft3", "UnitSymbol.charPers", "UnitSymbol.m3Compensated", "UnitSymbol.molPermol", "UnitSymbol.M", "UnitSymbol.onePerHz", "UnitSymbol.JPers", "UnitSymbol.Wh", "UnitSymbol.Gy", "UnitSymbol.gPerg", "UnitSymbol.kgm", "UnitSymbol.kgPerm3"];
for mrid in dataset.by_type.get("RaiseLowerCommand").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::RaiseLowerCommand>() {
Some(o) => o, None => continue,
};
if obj.base.base.unit_symbol.is_none() { continue; }
if !ALLOWED.contains(&obj.base.base.unit_symbol.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitSymbol-datatype".to_string(),
class: "RaiseLowerCommand".to_string(),
property: "Control.unitSymbol".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitSymbol-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_control_type_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
if obj.base.base.control_type.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.controlType-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "Control.controlType".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.controlType-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_unit_symbol_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.unitSymbol") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitSymbol-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "Control.unitSymbol".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitSymbol-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_analog_control_min_value_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
if obj.base.min_value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogControl.minValue-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "AnalogControl.minValue".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogControl.minValue-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_unit_symbol_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitSymbol.WPerm2", "UnitSymbol.molPerkg", "UnitSymbol.HPerm", "UnitSymbol.Ah", "UnitSymbol.N", "UnitSymbol.mPerm3", "UnitSymbol.sPers", "UnitSymbol.mol", "UnitSymbol.m3Uncompensated", "UnitSymbol.VPerV", "UnitSymbol.kgm2", "UnitSymbol.radPers", "UnitSymbol.m3Perkg", "UnitSymbol.SPerm", "UnitSymbol.Wb", "UnitSymbol.bar", "UnitSymbol.kat", "UnitSymbol.V2", "UnitSymbol.cosPhi", "UnitSymbol.Oe", "UnitSymbol.min", "UnitSymbol.Vs", "UnitSymbol.Q", "UnitSymbol.V2h", "UnitSymbol.VA", "UnitSymbol.dBm", "UnitSymbol.CPerkg", "UnitSymbol.Btu", "UnitSymbol.JPerkg", "UnitSymbol.lm", "UnitSymbol.Qh", "UnitSymbol.mPers2", "UnitSymbol.ha", "UnitSymbol.s", "UnitSymbol.rotPers", "UnitSymbol.tonne", "UnitSymbol.NPerm", "UnitSymbol.A", "UnitSymbol.A2", "UnitSymbol.Pa", "UnitSymbol.VAh", "UnitSymbol.none", "UnitSymbol.HzPers", "UnitSymbol.JPerm2", "UnitSymbol.JPerkgK", "UnitSymbol.Nm", "UnitSymbol.deg", "UnitSymbol.S", "UnitSymbol.kgPerJ", "UnitSymbol.As", "UnitSymbol.ohm", "UnitSymbol.A2h", "UnitSymbol.JPerm3", "UnitSymbol.T", "UnitSymbol.m2Pers", "UnitSymbol.onePerm", "UnitSymbol.lx", "UnitSymbol.lPers", "UnitSymbol.d", "UnitSymbol.C", "UnitSymbol.WPersr", "UnitSymbol.JPerK", "UnitSymbol.character", "UnitSymbol.APerA", "UnitSymbol.rad", "UnitSymbol.kg", "UnitSymbol.V", "UnitSymbol.therm", "UnitSymbol.CPerm3", "UnitSymbol.VArh", "UnitSymbol.Mx", "UnitSymbol.ppm", "UnitSymbol.WPerW", "UnitSymbol.JPermolK", "UnitSymbol.WPermK", "UnitSymbol.ohmPerm", "UnitSymbol.cd", "UnitSymbol.WPerm2sr", "UnitSymbol.h", "UnitSymbol.G", "UnitSymbol.VPerm", "UnitSymbol.Bq", "UnitSymbol.F", "UnitSymbol.Vh", "UnitSymbol.W", "UnitSymbol.lPerl", "UnitSymbol.GyPers", "UnitSymbol.HzPerHz", "UnitSymbol.Sv", "UnitSymbol.H", "UnitSymbol.molPerm3", "UnitSymbol.degC", "UnitSymbol.mmHg", "UnitSymbol.JPermol", "UnitSymbol.sr", "UnitSymbol.count", "UnitSymbol.CPerm2", "UnitSymbol.mPers", "UnitSymbol.radPers2", "UnitSymbol.m3Pers", "UnitSymbol.KPers", "UnitSymbol.anglemin", "UnitSymbol.PaPers", "UnitSymbol.VPerHz", "UnitSymbol.ohmm", "UnitSymbol.J", "UnitSymbol.m2", "UnitSymbol.Hz", "UnitSymbol.APerm", "UnitSymbol.m3Perh", "UnitSymbol.rev", "UnitSymbol.WPerA", "UnitSymbol.l", "UnitSymbol.K", "UnitSymbol.m3", "UnitSymbol.katPerm3", "UnitSymbol.WPers", "UnitSymbol.lPerh", "UnitSymbol.dB", "UnitSymbol.m", "UnitSymbol.FPerm", "UnitSymbol.A2s", "UnitSymbol.gal", "UnitSymbol.kn", "UnitSymbol.Pas", "UnitSymbol.VPerVAr", "UnitSymbol.VPerVA", "UnitSymbol.VAr", "UnitSymbol.anglesec", "UnitSymbol.ft3", "UnitSymbol.charPers", "UnitSymbol.m3Compensated", "UnitSymbol.molPermol", "UnitSymbol.M", "UnitSymbol.onePerHz", "UnitSymbol.JPers", "UnitSymbol.Wh", "UnitSymbol.Gy", "UnitSymbol.gPerg", "UnitSymbol.kgm", "UnitSymbol.kgPerm3"];
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
if obj.base.base.unit_symbol.is_none() { continue; }
if !ALLOWED.contains(&obj.base.base.unit_symbol.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitSymbol-datatype".to_string(),
class: "SetPoint".to_string(),
property: "Control.unitSymbol".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitSymbol-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_operation_in_progress_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.operationInProgress") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.operationInProgress-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "Control.operationInProgress".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.operationInProgress-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_time_stamp_datatype(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
if obj.base.base.time_stamp.is_empty() { continue; }
if !is_xsd_datetime(&obj.base.base.time_stamp) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.timeStamp-datatype".to_string(),
class: "SetPoint".to_string(),
property: "Control.timeStamp".to_string(),
message: "The datatype is not literal or it violates the xsd datatype.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.timeStamp-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_identified_object_description_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_unit_multiplier_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.unitMultiplier") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitMultiplier-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "Control.unitMultiplier".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitMultiplier-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_set_point_value_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
if obj.value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:SetPoint.value-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "SetPoint.value".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "SetPoint.value-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_time_stamp_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.timeStamp") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.timeStamp-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "Control.timeStamp".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.timeStamp-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_power_system_resource_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Control.PowerSystemResource") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.PowerSystemResource-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "Control.PowerSystemResource".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.PowerSystemResource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_analog_control_analog_value_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
if obj.base.analog_value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogControl.AnalogValue-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "AnalogControl.AnalogValue".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogControl.AnalogValue-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_set_point_normal_value_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
if obj.normal_value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:SetPoint.normalValue-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "SetPoint.normalValue".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "SetPoint.normalValue-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_control_unit_multiplier_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitMultiplier.k", "UnitMultiplier.da", "UnitMultiplier.Z", "UnitMultiplier.y", "UnitMultiplier.micro", "UnitMultiplier.Y", "UnitMultiplier.z", "UnitMultiplier.G", "UnitMultiplier.h", "UnitMultiplier.T", "UnitMultiplier.E", "UnitMultiplier.f", "UnitMultiplier.c", "UnitMultiplier.none", "UnitMultiplier.d", "UnitMultiplier.a", "UnitMultiplier.P", "UnitMultiplier.p", "UnitMultiplier.m", "UnitMultiplier.M", "UnitMultiplier.n"];
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
if obj.base.base.unit_multiplier.is_none() { continue; }
if !ALLOWED.contains(&obj.base.base.unit_multiplier.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Control.unitMultiplier-datatype".to_string(),
class: "SetPoint".to_string(),
property: "Control.unitMultiplier".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Control.unitMultiplier-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_analog_control_max_value_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
if obj.base.max_value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogControl.maxValue-cardinality".to_string(),
class: "SetPoint".to_string(),
property: "AnalogControl.maxValue".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogControl.maxValue-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_set_point_analog_control_analog_value_has_value(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("SetPoint").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::SetPoint>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.base.analog_value.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["AnalogValue"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:AnalogControl.AnalogValue-valueType".to_string(),
class: "SetPoint".to_string(),
property: "AnalogControl.AnalogValue".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:AnalogValue".to_string(),
severity: "sh:Violation".to_string(),
name: "AnalogControl.AnalogValue-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurement>() {
Some(o) => o, None => continue,
};
if obj.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "StringMeasurement".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_measurement_type_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurement>() {
Some(o) => o, None => continue,
};
if obj.base.measurement_type.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.measurementType-cardinality".to_string(),
class: "StringMeasurement".to_string(),
property: "Measurement.measurementType".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.measurementType-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_identified_object_description_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "StringMeasurement".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_power_system_reso_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurement>() {
Some(o) => o, None => continue,
};
if obj.base.power_system_resource.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.PowerSystemResource-cardinality".to_string(),
class: "StringMeasurement".to_string(),
property: "Measurement.PowerSystemResource".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.PowerSystemResource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_terminal_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Measurement.Terminal") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.Terminal-cardinality".to_string(),
class: "StringMeasurement".to_string(),
property: "Measurement.Terminal".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.Terminal-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurement>() {
Some(o) => o, None => continue,
};
if obj.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "StringMeasurement".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_phases_max_count(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("Measurement.phases") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.phases-cardinality".to_string(),
class: "StringMeasurement".to_string(),
property: "Measurement.phases".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.phases-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_unit_multiplier_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitMultiplier.k", "UnitMultiplier.da", "UnitMultiplier.Z", "UnitMultiplier.y", "UnitMultiplier.micro", "UnitMultiplier.Y", "UnitMultiplier.z", "UnitMultiplier.G", "UnitMultiplier.h", "UnitMultiplier.T", "UnitMultiplier.E", "UnitMultiplier.f", "UnitMultiplier.c", "UnitMultiplier.none", "UnitMultiplier.d", "UnitMultiplier.a", "UnitMultiplier.P", "UnitMultiplier.p", "UnitMultiplier.m", "UnitMultiplier.M", "UnitMultiplier.n"];
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurement>() {
Some(o) => o, None => continue,
};
if obj.base.unit_multiplier.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_multiplier.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitMultiplier-datatype".to_string(),
class: "StringMeasurement".to_string(),
property: "Measurement.unitMultiplier".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitMultiplier-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_unit_multiplier_r_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurement>() {
Some(o) => o, None => continue,
};
if obj.base.unit_multiplier.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitMultiplier-cardinality".to_string(),
class: "StringMeasurement".to_string(),
property: "Measurement.unitMultiplier".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitMultiplier-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_phases_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["PhaseCode.CN", "PhaseCode.XY", "PhaseCode.A", "PhaseCode.s12", "PhaseCode.B", "PhaseCode.ABCN", "PhaseCode.C", "PhaseCode.s1N", "PhaseCode.XYN", "PhaseCode.AB", "PhaseCode.X", "PhaseCode.s2N", "PhaseCode.AC", "PhaseCode.s2", "PhaseCode.ABC", "PhaseCode.XN", "PhaseCode.s12N", "PhaseCode.BC", "PhaseCode.AN", "PhaseCode.none", "PhaseCode.ACN", "PhaseCode.s1", "PhaseCode.BN", "PhaseCode.BCN", "PhaseCode.N", "PhaseCode.ABN"];
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurement>() {
Some(o) => o, None => continue,
};
if obj.base.phases.is_none() { continue; }
if !ALLOWED.contains(&obj.base.phases.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.phases-datatype".to_string(),
class: "StringMeasurement".to_string(),
property: "Measurement.phases".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.phases-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_unit_symbol_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurement>() {
Some(o) => o, None => continue,
};
if obj.base.unit_symbol.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitSymbol-cardinality".to_string(),
class: "StringMeasurement".to_string(),
property: "Measurement.unitSymbol".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitSymbol-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_measurement_unit_symbol_in(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
const ALLOWED: &[&str] = &["UnitSymbol.WPerm2", "UnitSymbol.molPerkg", "UnitSymbol.HPerm", "UnitSymbol.Ah", "UnitSymbol.N", "UnitSymbol.mPerm3", "UnitSymbol.sPers", "UnitSymbol.mol", "UnitSymbol.m3Uncompensated", "UnitSymbol.VPerV", "UnitSymbol.kgm2", "UnitSymbol.radPers", "UnitSymbol.m3Perkg", "UnitSymbol.SPerm", "UnitSymbol.Wb", "UnitSymbol.bar", "UnitSymbol.kat", "UnitSymbol.V2", "UnitSymbol.cosPhi", "UnitSymbol.Oe", "UnitSymbol.min", "UnitSymbol.Vs", "UnitSymbol.Q", "UnitSymbol.V2h", "UnitSymbol.VA", "UnitSymbol.dBm", "UnitSymbol.CPerkg", "UnitSymbol.Btu", "UnitSymbol.JPerkg", "UnitSymbol.lm", "UnitSymbol.Qh", "UnitSymbol.mPers2", "UnitSymbol.ha", "UnitSymbol.s", "UnitSymbol.rotPers", "UnitSymbol.tonne", "UnitSymbol.NPerm", "UnitSymbol.A", "UnitSymbol.A2", "UnitSymbol.Pa", "UnitSymbol.VAh", "UnitSymbol.none", "UnitSymbol.HzPers", "UnitSymbol.JPerm2", "UnitSymbol.JPerkgK", "UnitSymbol.Nm", "UnitSymbol.deg", "UnitSymbol.S", "UnitSymbol.kgPerJ", "UnitSymbol.As", "UnitSymbol.ohm", "UnitSymbol.A2h", "UnitSymbol.JPerm3", "UnitSymbol.T", "UnitSymbol.m2Pers", "UnitSymbol.onePerm", "UnitSymbol.lx", "UnitSymbol.lPers", "UnitSymbol.d", "UnitSymbol.C", "UnitSymbol.WPersr", "UnitSymbol.JPerK", "UnitSymbol.character", "UnitSymbol.APerA", "UnitSymbol.rad", "UnitSymbol.kg", "UnitSymbol.V", "UnitSymbol.therm", "UnitSymbol.CPerm3", "UnitSymbol.VArh", "UnitSymbol.Mx", "UnitSymbol.ppm", "UnitSymbol.WPerW", "UnitSymbol.JPermolK", "UnitSymbol.WPermK", "UnitSymbol.ohmPerm", "UnitSymbol.cd", "UnitSymbol.WPerm2sr", "UnitSymbol.h", "UnitSymbol.G", "UnitSymbol.VPerm", "UnitSymbol.Bq", "UnitSymbol.F", "UnitSymbol.Vh", "UnitSymbol.W", "UnitSymbol.lPerl", "UnitSymbol.GyPers", "UnitSymbol.HzPerHz", "UnitSymbol.Sv", "UnitSymbol.H", "UnitSymbol.molPerm3", "UnitSymbol.degC", "UnitSymbol.mmHg", "UnitSymbol.JPermol", "UnitSymbol.sr", "UnitSymbol.count", "UnitSymbol.CPerm2", "UnitSymbol.mPers", "UnitSymbol.radPers2", "UnitSymbol.m3Pers", "UnitSymbol.KPers", "UnitSymbol.anglemin", "UnitSymbol.PaPers", "UnitSymbol.VPerHz", "UnitSymbol.ohmm", "UnitSymbol.J", "UnitSymbol.m2", "UnitSymbol.Hz", "UnitSymbol.APerm", "UnitSymbol.m3Perh", "UnitSymbol.rev", "UnitSymbol.WPerA", "UnitSymbol.l", "UnitSymbol.K", "UnitSymbol.m3", "UnitSymbol.katPerm3", "UnitSymbol.WPers", "UnitSymbol.lPerh", "UnitSymbol.dB", "UnitSymbol.m", "UnitSymbol.FPerm", "UnitSymbol.A2s", "UnitSymbol.gal", "UnitSymbol.kn", "UnitSymbol.Pas", "UnitSymbol.VPerVAr", "UnitSymbol.VPerVA", "UnitSymbol.VAr", "UnitSymbol.anglesec", "UnitSymbol.ft3", "UnitSymbol.charPers", "UnitSymbol.m3Compensated", "UnitSymbol.molPermol", "UnitSymbol.M", "UnitSymbol.onePerHz", "UnitSymbol.JPers", "UnitSymbol.Wh", "UnitSymbol.Gy", "UnitSymbol.gPerg", "UnitSymbol.kgm", "UnitSymbol.kgPerm3"];
for mrid in dataset.by_type.get("StringMeasurement").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurement>() {
Some(o) => o, None => continue,
};
if obj.base.unit_symbol.is_none() { continue; }
if !ALLOWED.contains(&obj.base.unit_symbol.as_ref().map_or("", |u| u.uri.as_str())) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:Measurement.unitSymbol-datatype".to_string(),
class: "StringMeasurement".to_string(),
property: "Measurement.unitSymbol".to_string(),
message: "The datatype is not IRI (Internationalized Resource Identifier) or it is enumerated value not part of the profile.".to_string(),
severity: "sh:Violation".to_string(),
name: "Measurement.unitSymbol-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_string_measurement_valu_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurementValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurementValue>() {
Some(o) => o, None => continue,
};
if obj.string_measurement.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:StringMeasurementValue.StringMeasurement-cardinality".to_string(),
class: "StringMeasurementValue".to_string(),
property: "StringMeasurementValue.StringMeasurement".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "StringMeasurementValue.StringMeasurement-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_identified_object_m_rid_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurementValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurementValue>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "StringMeasurementValue".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_measurement_value_time_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurementValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurementValue>() {
Some(o) => o, None => continue,
};
if obj.base.time_stamp.is_empty() { continue; }
if !is_xsd_datetime(&obj.base.time_stamp) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.timeStamp-datatype".to_string(),
class: "StringMeasurementValue".to_string(),
property: "MeasurementValue.timeStamp".to_string(),
message: "The datatype is not literal or it violates the xsd datatype.".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.timeStamp-datatype".to_string(),
description: "This constraint validates the datatype of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_string_measurement_valu_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurementValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurementValue>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.string_measurement.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["StringMeasurement"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:StringMeasurementValue.StringMeasurement-valueType".to_string(),
class: "StringMeasurementValue".to_string(),
property: "StringMeasurementValue.StringMeasurement".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:StringMeasurement".to_string(),
severity: "sh:Violation".to_string(),
name: "StringMeasurementValue.StringMeasurement-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_measurement_value_time_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurementValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("MeasurementValue.timeStamp") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.timeStamp-cardinality".to_string(),
class: "StringMeasurementValue".to_string(),
property: "MeasurementValue.timeStamp".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.timeStamp-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_measurement_value_measu_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurementValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurementValue>() {
Some(o) => o, None => continue,
};
if obj.base.measurement_value_source.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.MeasurementValueSource-cardinality".to_string(),
class: "StringMeasurementValue".to_string(),
property: "MeasurementValue.MeasurementValueSource".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.MeasurementValueSource-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_measurement_value_senso_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurementValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("MeasurementValue.sensorAccuracy") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.sensorAccuracy-cardinality".to_string(),
class: "StringMeasurementValue".to_string(),
property: "MeasurementValue.sensorAccuracy".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.sensorAccuracy-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_identified_object_name_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurementValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurementValue>() {
Some(o) => o, None => continue,
};
if obj.base.base.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "StringMeasurementValue".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_measurement_value_measu_etc_2(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurementValue").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::StringMeasurementValue>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.base.measurement_value_source.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["MeasurementValueSource"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:MeasurementValue.MeasurementValueSource-valueType".to_string(),
class: "StringMeasurementValue".to_string(),
property: "MeasurementValue.MeasurementValueSource".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:MeasurementValueSource".to_string(),
severity: "sh:Violation".to_string(),
name: "MeasurementValue.MeasurementValueSource-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_string_measurement_value_identified_object_descr_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("StringMeasurementValue").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "StringMeasurementValue".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_value_alias_set_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("ValueAliasSet").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::ValueAliasSet>() {
Some(o) => o, None => continue,
};
if obj.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "ValueAliasSet".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_value_alias_set_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("ValueAliasSet").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::ValueAliasSet>() {
Some(o) => o, None => continue,
};
if obj.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "ValueAliasSet".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_value_alias_set_identified_object_description_ma_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("ValueAliasSet").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "ValueAliasSet".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_value_to_alias_value_alias_set_re_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("ValueToAlias").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::ValueToAlias>() {
Some(o) => o, None => continue,
};
if obj.value_alias_set.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:ValueToAlias.ValueAliasSet-cardinality".to_string(),
class: "ValueToAlias".to_string(),
property: "ValueToAlias.ValueAliasSet".to_string(),
message: "Missing required association.".to_string(),
severity: "sh:Violation".to_string(),
name: "ValueToAlias.ValueAliasSet-cardinality".to_string(),
description: "This constraint validates the cardinality of the association at the used direction.".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_value_to_alias_value_alias_set_ha_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("ValueToAlias").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::ValueToAlias>() {
Some(o) => o, None => continue,
};
let ref_mrid = match obj.value_alias_set.as_ref() {
Some(r) => r.mrid.trim_start_matches('#'), None => continue,
};
if let Some(ref_entry) = dataset.entries.get(ref_mrid) {
let allowed: &[&str] = &["ValueAliasSet"];
if !allowed.contains(&ref_entry.element.type_name()) {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:ValueToAlias.ValueAliasSet-valueType".to_string(),
class: "ValueToAlias".to_string(),
property: "ValueToAlias.ValueAliasSet".to_string(),
message: "One of the following does not conform: 1) The value type shall be IRI; 2) The value type shall be an instance of the class: cim:ValueAliasSet".to_string(),
severity: "sh:Violation".to_string(),
name: "ValueToAlias.ValueAliasSet-valueType".to_string(),
description: "This constraint validates the value type of the association at the used direction.".to_string(),
});
}
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_identified_object_m_rid_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("ValueToAlias").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::ValueToAlias>() {
Some(o) => o, None => continue,
};
if obj.base.m_rid.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.mRID-cardinality".to_string(),
class: "ValueToAlias".to_string(),
property: "IdentifiedObject.mRID".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.mRID-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_identified_object_description_max_etc(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("ValueToAlias").into_iter().flatten() {
if dataset.entries[mrid].block.duplicate_fields.contains("IdentifiedObject.description") {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.description-cardinality".to_string(),
class: "ValueToAlias".to_string(),
property: "IdentifiedObject.description".to_string(),
message: "Cardinality violation. Upper bound shall be 1".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.description-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_identified_object_name_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("ValueToAlias").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::ValueToAlias>() {
Some(o) => o, None => continue,
};
if obj.base.name.is_empty() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "ido:IdentifiedObject.name-cardinality".to_string(),
class: "ValueToAlias".to_string(),
property: "IdentifiedObject.name".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "IdentifiedObject.name-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}
pub fn check_p61970_600_2_operation_ap_con_simple_shacl_value_to_alias_value_to_alias_value_required(dataset: &CimDataset) -> Vec<Violation> {
let mut violations = Vec::new();
for mrid in dataset.by_type.get("ValueToAlias").into_iter().flatten() {
let entry = &dataset.entries[mrid];
let obj = match entry.element.as_any()
.downcast_ref::<cimstructs::ValueToAlias>() {
Some(o) => o, None => continue,
};
if obj.value.is_none() {
violations.push(Violation {
object_id: mrid.clone(),
rule_id: "op:ValueToAlias.value-cardinality".to_string(),
class: "ValueToAlias".to_string(),
property: "ValueToAlias.value".to_string(),
message: "Missing required property (attribute).".to_string(),
severity: "sh:Violation".to_string(),
name: "ValueToAlias.value-cardinality".to_string(),
description: "This constraint validates the cardinality of the property (attribute).".to_string(),
});
}
}
violations
}