validateCatalogItemExamples function

Future<List<ExampleValidationError>> validateCatalogItemExamples(
  1. CatalogItem item,
  2. Catalog catalog
)

Validates the examples for a single catalog item.

The item is the CatalogItem to validate. The catalog is the full catalog used for context, including any additional catalogs.

Returns a list of validation errors. An empty list means success.

Implementation

Future<List<ExampleValidationError>> validateCatalogItemExamples(
  CatalogItem item,
  Catalog catalog,
) async {
  final Schema schema = A2uiSchemas.surfaceUpdateSchema(catalog);
  final errors = <ExampleValidationError>[];

  for (var i = 0; i < item.exampleData.length; i++) {
    final String exampleJsonString = item.exampleData[i]();
    final List<Object?> exampleData;
    try {
      exampleData = jsonDecode(exampleJsonString) as List<Object?>;
    } catch (e) {
      errors.add(
        ExampleValidationError(i, 'Failed to parse as a JSON list', cause: e),
      );
      continue;
    }

    final List<Component> components = exampleData
        .map((e) => Component.fromJson(e as JsonMap))
        .toList();

    if (components.every((c) => c.id != 'root')) {
      errors.add(
        ExampleValidationError(
          i,
          'Example must have a component with id "root"',
        ),
      );
    }

    final surfaceUpdate = SurfaceUpdate(
      surfaceId: 'test-surface',
      components: components,
    );

    final List<ValidationError> validationErrors = await schema.validate(
      surfaceUpdate.toJson(),
    );
    if (validationErrors.isNotEmpty) {
      errors.add(
        ExampleValidationError(
          i,
          'Schema validation failed',
          cause: validationErrors,
        ),
      );
    }
  }
  return errors;
}