blob: 3dc1beafc230c21f89c362ea1b99bbd23e74d501 [file] [log] [blame]
// Copyright (c) 2020, 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 '../watcher.dart';
/// A factory to produce custom watchers for specific file paths.
class _CustomWatcherFactory {
final String id;
final DirectoryWatcher Function(String path, {Duration pollingDelay})
createDirectoryWatcher;
final FileWatcher Function(String path, {Duration pollingDelay})
createFileWatcher;
_CustomWatcherFactory(
this.id, this.createDirectoryWatcher, this.createFileWatcher);
}
/// Registers a custom watcher.
///
/// Each custom watcher must have a unique [id] and the same watcher may not be
/// registered more than once.
/// [createDirectoryWatcher] and [createFileWatcher] should return watchers for
/// the file paths they are able to handle. If the custom watcher is not able to
/// handle the path it should reuturn null.
/// The paths handled by each custom watch may not overlap, at most one custom
/// matcher may return a non-null watcher for a given path.
///
/// When a file or directory watcher is created the path is checked against each
/// registered custom watcher, and if exactly one custom watcher is available it
/// will be used instead of the default.
void registerCustomWatcher(
String id,
DirectoryWatcher Function(String path, {Duration pollingDelay})
createDirectoryWatcher,
FileWatcher Function(String path, {Duration pollingDelay}) createFileWatcher,
) {
if (_customWatcherFactories.containsKey(id)) {
throw ArgumentError('A custom watcher with id `$id` '
'has already been registered');
}
_customWatcherFactories[id] = _CustomWatcherFactory(
id,
createDirectoryWatcher ?? (_, {pollingDelay}) => null,
createFileWatcher ?? (_, {pollingDelay}) => null);
}
/// Tries to create a custom [DirectoryWatcher] and returns it.
///
/// Returns `null` if no custom watcher was applicable and throws a [StateError]
/// if more than one was.
DirectoryWatcher createCustomDirectoryWatcher(String path,
{Duration pollingDelay}) {
DirectoryWatcher customWatcher;
String customFactoryId;
for (var watcherFactory in _customWatcherFactories.values) {
if (customWatcher != null) {
throw StateError('Two `CustomWatcherFactory`s applicable: '
'`$customFactoryId` and `${watcherFactory.id}` for `$path`');
}
customWatcher =
watcherFactory.createDirectoryWatcher(path, pollingDelay: pollingDelay);
customFactoryId = watcherFactory.id;
}
return customWatcher;
}
/// Tries to create a custom [FileWatcher] and returns it.
///
/// Returns `null` if no custom watcher was applicable and throws a [StateError]
/// if more than one was.
FileWatcher createCustomFileWatcher(String path, {Duration pollingDelay}) {
FileWatcher customWatcher;
String customFactoryId;
for (var watcherFactory in _customWatcherFactories.values) {
if (customWatcher != null) {
throw StateError('Two `CustomWatcherFactory`s applicable: '
'`$customFactoryId` and `${watcherFactory.id}` for `$path`');
}
customWatcher =
watcherFactory.createFileWatcher(path, pollingDelay: pollingDelay);
customFactoryId = watcherFactory.id;
}
return customWatcher;
}
final _customWatcherFactories = <String, _CustomWatcherFactory>{};