/**
 * This library adds `dart:io` support to the HTML5 parser. Call
 * [initDartIOSupport] before calling the [parse] methods and they will accept
 * a [RandomAccessFile] as input, in addition to the other input types.
 */
library parser_console;

import 'dart:io';
import 'parser.dart';
import 'src/inputstream.dart' as inputstream;

/**
 * Adds support to the [HtmlParser] for running on a console VM. In particular
 * this means it will be able to handle `dart:io` and [RandomAccessFile]s as
 * input to the various [parse] methods.
 */
void useConsole() {
  inputstream.consoleSupport = new _ConsoleSupport();
}

class _ConsoleSupport extends inputstream.ConsoleSupport {
  List<int> bytesFromFile(source) {
    if (source is! RandomAccessFile) return null;
    return readAllBytesFromFile(source);
  }
}

// TODO(jmesserly): this should be `RandomAccessFile.readAllBytes`.
/** Synchronously reads all bytes from the [file]. */
List<int> readAllBytesFromFile(RandomAccessFile file) {
  int length = file.lengthSync();
  var bytes = new List<int>(length);

  int bytesRead = 0;
  while (bytesRead < length) {
    int read = file.readIntoSync(bytes, bytesRead, length - bytesRead);
    if (read <= 0) {
      // This could happen if, for example, the file was resized while
      // we're reading. Just shrink the bytes array and move on.
      bytes = bytes.sublist(0, bytesRead);
      break;
    }
    bytesRead += read;
  }
  return bytes;
}
