def validate()

in rostran/core/metadata.py [0:0]


    def validate(self):
        if not isinstance(self.type, str):
            raise InvalidTemplateMetaDataItem(
                name=self.type,
                reason=f"The type should be str",
            )
        if self.type in (self.ROS_INTERFACE, self.ROS_DESIGNER) and not isinstance(
            self.value, dict
        ):
            raise InvalidTemplateMetaDataItem(
                name=self.type,
                reason=f"The type of value ({self.value}) should be dict",
            )

        # validate PredefinedParameters
        if self.type == self.PREDEFINED_PARAMETERS:
            if not isinstance(self.value, list):
                raise InvalidTemplateMetaDataItem(
                    name=self.type,
                    reason=f"The type of value ({self.value}) should be list",
                )
            for i, pp in enumerate(self.value):
                if not isinstance(pp, dict):
                    raise InvalidTemplateMetaDataItem(
                        name=f"{self.type}[{i}]",
                        reason=f"The type of value ({pp}) should be dict",
                    )
                if self.NAME not in pp:
                    raise InvalidTemplateMetaDataItem(
                        name=f"{self.type}[{i}]",
                        reason=f"{self.NAME} is missing",
                    )
                name = pp[self.NAME]
                if not isinstance(name, str):
                    raise InvalidTemplateMetaDataItem(
                        name=f"{self.type}[{i}].{self.NAME}",
                        reason=f"The type of value ({name}) should be str",
                    )
                if self.PARAMETERS not in pp:
                    raise InvalidTemplateMetaDataItem(
                        name=f"{self.type}[{i}]",
                        reason=f"{self.PARAMETERS} is missing",
                    )
                parameters = pp[self.PARAMETERS]
                if not isinstance(parameters, dict):
                    raise InvalidTemplateMetaDataItem(
                        name=f"{self.type}[{i}].{self.PARAMETERS}",
                        reason=f"The type of value ({parameters}) should be dict",
                    )

        # validate ALIYUN::ROS::Interface
        if self.type == self.ROS_INTERFACE:
            # validate ParameterGroups
            if self.PARAMETER_GROUPS in self.value:
                param_groups = self.value[self.PARAMETER_GROUPS]
                if not isinstance(param_groups, list):
                    raise InvalidTemplateMetaDataItem(
                        name=f"{self.ROS_INTERFACE}.{self.PARAMETER_GROUPS}",
                        reason=f"The type of value ({param_groups}) should be list",
                    )

                for i, param_group in enumerate(param_groups):
                    if not isinstance(param_group, dict):
                        raise InvalidTemplateMetaDataItem(
                            name=f"{self.ROS_INTERFACE}.{self.PARAMETER_GROUPS}[{i}]",
                            reason=f"The type of value ({param_group}) should be dict",
                        )
                    # validate Parameters
                    if self.PARAMETERS not in param_group:
                        raise InvalidTemplateMetaDataItem(
                            name=f"{self.ROS_INTERFACE}.{self.PARAMETER_GROUPS}[{i}]",
                            reason=f"{self.PARAMETERS} is missing",
                        )
                    parameters = param_group[self.PARAMETERS]
                    if not isinstance(parameters, list):
                        raise InvalidTemplateMetaDataItem(
                            name=f"{self.ROS_INTERFACE}.{self.PARAMETER_GROUPS}[{i}].{self.PARAMETERS}",
                            reason=f"The type of value ({parameters}) should be list",
                        )
                    for j, parameter in enumerate(parameters):
                        if isinstance(parameter, dict):
                            continue
                        if not isinstance(parameter, str):
                            raise InvalidTemplateMetaDataItem(
                                name=f"{self.ROS_INTERFACE}.{self.PARAMETER_GROUPS}[{i}].{self.PARAMETERS}[{j}]",
                                reason=f"The type of value ({parameter}) should be str",
                            )
                    # validate Label
                    if self.LABEL in param_group:
                        label = param_group[self.LABEL]
                        if not isinstance(label, dict):
                            raise InvalidTemplateMetaDataItem(
                                name=f"{self.ROS_INTERFACE}.{self.PARAMETER_GROUPS}[{i}].{self.LABEL}",
                                reason=f"The type of value ({label}) should be dict",
                            )
                        if not any(key in label for key in self.LABEL_KEYS):
                            label_keys = ", ".join(self.LABEL_KEYS)
                            raise InvalidTemplateMetaDataItem(
                                name=f"{self.ROS_INTERFACE}.{self.PARAMETER_GROUPS}[{i}].{self.LABEL}",
                                reason=f"one of {label_keys} is missing",
                            )

            # validate TemplateTags
            if self.TEMPLATE_TAGS in self.value:
                template_tags = self.value[self.TEMPLATE_TAGS]
                if not isinstance(template_tags, list):
                    raise InvalidTemplateMetaDataItem(
                        name=f"{self.ROS_INTERFACE}.{self.TEMPLATE_TAGS}",
                        reason=f"The type of value ({template_tags}) should be list",
                    )
                for i, template_tag in enumerate(template_tags):
                    if not isinstance(template_tag, str):
                        raise InvalidTemplateMetaDataItem(
                            name=f"{self.ROS_INTERFACE}.{self.TEMPLATE_TAGS}[{i}]",
                            reason=f"The type of value ({template_tag}) should be str",
                        )