blob: 53656144ec12f46825c27a9328fe33740dcb0d4e [file] [log] [blame]
// Copyright (c) 2017, 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 file.
import 'dart:async';
import 'dart:convert';
import 'package:file/file.dart';
import 'package:file/src/io.dart' as io;
import 'recording_file_system.dart';
import 'recording_file_system_entity.dart';
import 'recording_io_sink.dart';
import 'recording_random_access_file.dart';
/// [File] implementation that records all invocation activity to its file
/// system's recording.
class RecordingFile extends RecordingFileSystemEntity<File, io.File>
implements File {
/// Creates a new `RecordingFile`.
RecordingFile(RecordingFileSystem fileSystem, io.File delegate)
: super(fileSystem, delegate) {
methods.addAll(<Symbol, Function>{
#create: _create,
#createSync: delegate.createSync,
#copy: _copy,
#copySync: _copySync,
#length: delegate.length,
#lengthSync: delegate.lengthSync,
#lastModified: delegate.lastModified,
#lastModifiedSync: delegate.lastModifiedSync,
#open: _open,
#openSync: _openSync,
#openRead: delegate.openRead,
#openWrite: _openWrite,
#readAsBytes: delegate.readAsBytes,
#readAsBytesSync: delegate.readAsBytesSync,
#readAsString: delegate.readAsString,
#readAsStringSync: delegate.readAsStringSync,
#readAsLines: delegate.readAsLines,
#readAsLinesSync: delegate.readAsLinesSync,
#writeAsBytes: _writeAsBytes,
#writeAsBytesSync: delegate.writeAsBytesSync,
#writeAsString: _writeAsString,
#writeAsStringSync: delegate.writeAsStringSync,
});
}
@override
File wrap(io.File delegate) => super.wrap(delegate) ?? wrapFile(delegate);
RandomAccessFile _wrapRandomAccessFile(RandomAccessFile delegate) =>
new RecordingRandomAccessFile(fileSystem, delegate);
Future<File> _create({bool recursive: false}) =>
delegate.create(recursive: recursive).then(wrap);
Future<File> _copy(String newPath) => delegate.copy(newPath).then(wrap);
File _copySync(String newPath) => wrap(delegate.copySync(newPath));
Future<RandomAccessFile> _open({FileMode mode: FileMode.READ}) =>
delegate.open(mode: mode).then(_wrapRandomAccessFile);
RandomAccessFile _openSync({FileMode mode: FileMode.READ}) =>
_wrapRandomAccessFile(delegate.openSync(mode: mode));
IOSink _openWrite({FileMode mode: FileMode.WRITE, Encoding encoding: UTF8}) {
return new RecordingIOSink(
fileSystem,
delegate.openWrite(mode: mode, encoding: encoding),
);
}
Future<File> _writeAsBytes(
List<int> bytes, {
FileMode mode: FileMode.WRITE,
bool flush: false,
}) =>
delegate.writeAsBytes(bytes, mode: mode, flush: flush).then(wrap);
Future<File> _writeAsString(
String contents, {
FileMode mode: FileMode.WRITE,
Encoding encoding: UTF8,
bool flush: false,
}) =>
delegate
.writeAsString(contents, mode: mode, encoding: encoding, flush: flush)
.then(wrap);
}