|
5 | 5 | import 'dart:async'; |
6 | 6 | import 'dart:convert'; |
7 | 7 |
|
| 8 | +import 'package:meta/meta.dart'; |
8 | 9 | import 'package:file/file.dart'; |
9 | 10 | import 'package:file/src/io.dart' as io; |
10 | 11 |
|
@@ -139,6 +140,52 @@ class RecordingFile extends RecordingFileSystemEntity<File, io.File> |
139 | 140 | .then(wrap); |
140 | 141 | } |
141 | 142 |
|
| 143 | +abstract class _ExternalReference<T> extends ResultReference<T> { |
| 144 | + final File file; |
| 145 | + final T _value; |
| 146 | + |
| 147 | + _ExternalReference(MutableRecording recording, String name, this._value) |
| 148 | + : file = recording.newFile(name); |
| 149 | + |
| 150 | + @protected |
| 151 | + void writeDataToFile(T value); |
| 152 | + |
| 153 | + @override |
| 154 | + T get value { |
| 155 | + writeDataToFile(_value); |
| 156 | + return _value; |
| 157 | + } |
| 158 | + |
| 159 | + @override |
| 160 | + T get recordedValue => _value; |
| 161 | + |
| 162 | + @override |
| 163 | + dynamic get serializedValue => '!${file.basename}'; |
| 164 | +} |
| 165 | + |
| 166 | +abstract class _ExternalFutureReference<T> extends FutureReference<T> { |
| 167 | + final File file; |
| 168 | + |
| 169 | + _ExternalFutureReference( |
| 170 | + MutableRecording recording, String name, Future<T> future) |
| 171 | + : file = recording.newFile(name), |
| 172 | + super(future); |
| 173 | + |
| 174 | + @protected |
| 175 | + Future<Null> writeDataToFile(T value); |
| 176 | + |
| 177 | + @override |
| 178 | + Future<T> get value { |
| 179 | + return super.value.then((T value) async { |
| 180 | + await writeDataToFile(value); |
| 181 | + return value; |
| 182 | + }); |
| 183 | + } |
| 184 | + |
| 185 | + @override |
| 186 | + dynamic get serializedValue => '!${file.basename}'; |
| 187 | +} |
| 188 | + |
142 | 189 | class _ByteArrayStreamReference extends StreamReference<List<int>> { |
143 | 190 | final File file; |
144 | 191 | IOSink _sink; |
@@ -172,122 +219,65 @@ class _ByteArrayStreamReference extends StreamReference<List<int>> { |
172 | 219 | Future.wait(<Future<dynamic>>[super.complete, _sink.done]).then((_) {}); |
173 | 220 | } |
174 | 221 |
|
175 | | -class _ByteArrayFutureReference extends FutureReference<List<int>> { |
176 | | - final File file; |
177 | | - |
| 222 | +class _ByteArrayFutureReference extends _ExternalFutureReference<List<int>> { |
178 | 223 | _ByteArrayFutureReference( |
179 | 224 | MutableRecording recording, String name, Future<List<int>> future) |
180 | | - : file = recording.newFile(name), |
181 | | - super(future); |
| 225 | + : super(recording, name, future); |
182 | 226 |
|
183 | 227 | @override |
184 | | - Future<List<int>> get value { |
185 | | - return super.value.then((List<int> bytes) async { |
186 | | - await file.writeAsBytes(bytes, flush: true); |
187 | | - return bytes; |
188 | | - }); |
| 228 | + Future<Null> writeDataToFile(List<int> bytes) async { |
| 229 | + await file.writeAsBytes(bytes, flush: true); |
189 | 230 | } |
190 | | - |
191 | | - @override |
192 | | - dynamic get serializedValue => '!${file.basename}'; |
193 | 231 | } |
194 | 232 |
|
195 | | -class _ByteArrayReference extends ResultReference<List<int>> { |
196 | | - final File file; |
197 | | - final List<int> bytes; |
198 | | - |
199 | | - _ByteArrayReference(MutableRecording recording, String name, this.bytes) |
200 | | - : file = recording.newFile(name); |
| 233 | +class _ByteArrayReference extends _ExternalReference<List<int>> { |
| 234 | + _ByteArrayReference(MutableRecording recording, String name, List<int> bytes) |
| 235 | + : super(recording, name, bytes); |
201 | 236 |
|
202 | 237 | @override |
203 | | - List<int> get value { |
| 238 | + void writeDataToFile(List<int> bytes) { |
204 | 239 | file.writeAsBytesSync(bytes, flush: true); |
205 | | - return bytes; |
206 | 240 | } |
207 | | - |
208 | | - @override |
209 | | - List<int> get recordedValue => bytes; |
210 | | - |
211 | | - @override |
212 | | - dynamic get serializedValue => '!${file.basename}'; |
213 | 241 | } |
214 | 242 |
|
215 | | -class _FileContentFutureReference extends FutureReference<String> { |
216 | | - final File file; |
217 | | - |
| 243 | +class _FileContentFutureReference extends _ExternalFutureReference<String> { |
218 | 244 | _FileContentFutureReference( |
219 | 245 | MutableRecording recording, String name, Future<String> future) |
220 | | - : file = recording.newFile(name), |
221 | | - super(future); |
| 246 | + : super(recording, name, future); |
222 | 247 |
|
223 | 248 | @override |
224 | | - Future<String> get value { |
225 | | - return super.value.then((String content) async { |
226 | | - await file.writeAsString(content, flush: true); |
227 | | - return content; |
228 | | - }); |
| 249 | + Future<Null> writeDataToFile(String content) async { |
| 250 | + await file.writeAsString(content, flush: true); |
229 | 251 | } |
230 | | - |
231 | | - @override |
232 | | - dynamic get serializedValue => '!${file.basename}'; |
233 | 252 | } |
234 | 253 |
|
235 | | -class _FileContentReference extends ResultReference<String> { |
236 | | - final File file; |
237 | | - final String content; |
238 | | - |
239 | | - _FileContentReference(MutableRecording recording, String name, this.content) |
240 | | - : file = recording.newFile(name); |
| 254 | +class _FileContentReference extends _ExternalReference<String> { |
| 255 | + _FileContentReference(MutableRecording recording, String name, String content) |
| 256 | + : super(recording, name, content); |
241 | 257 |
|
242 | 258 | @override |
243 | | - String get value { |
| 259 | + void writeDataToFile(String content) { |
244 | 260 | file.writeAsStringSync(content, flush: true); |
245 | | - return content; |
246 | 261 | } |
247 | | - |
248 | | - @override |
249 | | - String get recordedValue => content; |
250 | | - |
251 | | - @override |
252 | | - dynamic get serializedValue => '!${file.basename}'; |
253 | 262 | } |
254 | 263 |
|
255 | | -class _LinesFutureReference extends FutureReference<List<String>> { |
256 | | - final File file; |
257 | | - |
| 264 | +class _LinesFutureReference extends _ExternalFutureReference<List<String>> { |
258 | 265 | _LinesFutureReference( |
259 | 266 | MutableRecording recording, String name, Future<List<String>> future) |
260 | | - : file = recording.newFile(name), |
261 | | - super(future); |
| 267 | + : super(recording, name, future); |
262 | 268 |
|
263 | 269 | @override |
264 | | - Future<List<String>> get value { |
265 | | - return super.value.then((List<String> lines) async { |
266 | | - await file.writeAsString(lines.join('\n'), flush: true); |
267 | | - return lines; |
268 | | - }); |
| 270 | + Future<Null> writeDataToFile(List<String> lines) async { |
| 271 | + await file.writeAsString(lines.join('\n'), flush: true); |
269 | 272 | } |
270 | | - |
271 | | - @override |
272 | | - dynamic get serializedValue => '!${file.basename}'; |
273 | 273 | } |
274 | 274 |
|
275 | | -class _LinesReference extends ResultReference<List<String>> { |
276 | | - final File file; |
277 | | - final List<String> lines; |
278 | | - |
279 | | - _LinesReference(MutableRecording recording, String name, this.lines) |
280 | | - : file = recording.newFile(name); |
| 275 | +class _LinesReference extends _ExternalReference<List<String>> { |
| 276 | + _LinesReference(MutableRecording recording, String name, List<String> lines) |
| 277 | + : super(recording, name, lines); |
281 | 278 |
|
282 | 279 | @override |
283 | | - List<String> get value { |
| 280 | + void writeDataToFile(List<String> lines) { |
284 | 281 | file.writeAsStringSync(lines.join('\n'), flush: true); |
285 | | - return lines; |
286 | 282 | } |
287 | | - |
288 | | - @override |
289 | | - List<String> get recordedValue => lines; |
290 | | - |
291 | | - @override |
292 | | - dynamic get serializedValue => '!${file.basename}'; |
293 | 283 | } |
0 commit comments