FeedTomlReader.java

package net.sasasin.sreader.service.feed.toml;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * Orchestrates parse → schema validate → domain map and aggregates diagnostics. Does not access
 * repositories or plan imports.
 */
final class FeedTomlReader {

  private final FeedTomlParser parser;
  private final FeedTomlSchemaValidator validator;
  private final FeedTomlImportMapper mapper;

  FeedTomlReader(
      FeedTomlParser parser, FeedTomlSchemaValidator validator, FeedTomlImportMapper mapper) {
    this.parser = Objects.requireNonNull(parser, "parser");
    this.validator = Objects.requireNonNull(validator, "validator");
    this.mapper = Objects.requireNonNull(mapper, "mapper");
  }

  List<FeedTomlService.ImportFeed> read(String input) {
    ParsedFeedToml parsed = parser.parse(input);
    FeedTomlSchemaValidator.Result validated = validator.validate(parsed.document());
    FeedTomlImportMapper.Result mapped = mapper.map(validated.schemaVersion(), validated.feeds());

    List<FeedTomlIssue> issues = new ArrayList<>();
    issues.addAll(parsed.syntaxIssues());
    issues.addAll(validated.issues());
    issues.addAll(mapped.issues());

    if (!issues.isEmpty()) {
      throw new FeedTomlService.TomlValidationException(FeedTomlIssue.renderAll(issues));
    }
    return List.copyOf(mapped.feeds());
  }
}