// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.

// @dart = 2.9

library fasta.testing.scanner_chain;

import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
    show ScannerResult, scan;

import 'package:_fe_analyzer_shared/src/scanner/io.dart' show readBytesFromFile;

import 'package:testing/testing.dart'
    show ChainContext, Result, Step, TestDescription;

class ReadFile {
  final Uri uri;

  final List<int> bytes;

  const ReadFile(this.uri, this.bytes);
}

class ScannedFile {
  final ReadFile file;

  final ScannerResult result;

  const ScannedFile(this.file, this.result);
}

class Read extends Step<TestDescription, ReadFile, ChainContext> {
  const Read();

  String get name => "read";

  Future<Result<ReadFile>> run(
      TestDescription input, ChainContext context) async {
    return pass(new ReadFile(input.uri, await readBytesFromFile(input.uri)));
  }
}

class Scan extends Step<ReadFile, ScannedFile, ChainContext> {
  const Scan();

  String get name => "scan";

  Future<Result<ScannedFile>> run(ReadFile file, ChainContext context) async {
    return pass(new ScannedFile(file, scan(file.bytes)));
  }
}
