validateYamlDefinition static method

void validateYamlDefinition(
  1. GeneratorConfig config,
  2. String yaml,
  3. Uri sourceUri,
  4. CodeAnalysisCollector collector,
  5. SerializableModelDefinition? model,
  6. ParsedModelsCollection parsedModels,
)

Validates a yaml file against an expected syntax for model files.

Implementation

static void validateYamlDefinition(
  GeneratorConfig config,
  String yaml,
  Uri sourceUri,
  CodeAnalysisCollector collector,
  SerializableModelDefinition? model,
  ParsedModelsCollection parsedModels,
) {
  var yamlErrors = ErrorCollector();
  YamlMap? document = _loadYamlMap(yaml, sourceUri, yamlErrors);
  collector.addErrors(yamlErrors.errors);

  if (yamlErrors.errors.isNotEmpty) return;

  var documentContents = document;
  if (documentContents is! YamlMap) {
    var firstLine = yaml.split('\n').first;
    collector.addError(
      SourceSpanSeverityException(
          'The top level object in the class yaml file must be a Map.',
          SourceSpan(
            SourceLocation(0, sourceUrl: sourceUri),
            SourceLocation(firstLine.length, sourceUrl: sourceUri),
            firstLine,
          )),
    );
    return;
  }

  var topErrors = validateTopLevelModelType(
    documentContents,
    _modelClassTypes,
  );
  collector.addErrors(topErrors);

  var definitionType = _findDefinitionType(documentContents);
  if (definitionType == null) return;

  var restrictions = Restrictions(
    config: config,
    documentType: definitionType,
    documentContents: documentContents,
    documentDefinition: model,
    parsedModels: parsedModels,
  );

  var generateCollisionErrors = validateDuplicateFileName(
    documentContents,
    restrictions,
  );
  collector.addErrors(generateCollisionErrors);

  Set<ValidateNode> documentStructure;
  switch (definitionType) {
    case Keyword.classType:
      documentStructure = ClassYamlDefinition(restrictions).documentStructure;
      break;
    case Keyword.exceptionType:
      documentStructure = ExceptionYamlDefinition(
        restrictions,
      ).documentStructure;
      break;
    case Keyword.enumType:
      documentStructure = EnumYamlDefinition(restrictions).documentStructure;
      break;
    default:
      throw UnimplementedError(
          'Validation for $definitionType is not implemented.');
  }

  validateYamlModel(
    definitionType,
    documentStructure,
    documentContents,
    collector,
  );

  return;
}