blob: 0d9a9651cca857dd2050cb84b2ea3f25dc5c207c [file] [log] [blame]
// Copyright (c) 2014, 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.
library pub.excluding_transformer;
import 'dart:async';
import 'package:barback/barback.dart';
/// Decorates an inner [Transformer] and handles including and excluding
/// primary inputs.
class ExcludingTransformer extends Transformer {
/// If [includes] or [excludes] is non-null, wraps [inner] in an
/// [ExcludingTransformer] that handles those.
///
/// Otherwise, just returns [inner] unmodified.
static Transformer wrap(Transformer inner, Set<String> includes,
Set<String> excludes) {
if (includes == null && excludes == null) return inner;
return new ExcludingTransformer._(inner, includes, excludes);
}
final Transformer _inner;
/// The set of asset paths which should be included.
///
/// If `null`, all non-excluded assets are allowed. Otherwise, only included
/// assets are allowed.
final Set<String> _includes;
/// The set of assets which should be excluded.
///
/// Exclusions are applied after inclusions.
final Set<String> _excludes;
ExcludingTransformer._(this._inner, this._includes, this._excludes);
isPrimary(AssetId id) {
// TODO(rnystrom): Support globs in addition to paths. See #17093.
if (_includes != null) {
// If there are any includes, it must match one of them.
if (!_includes.contains(id.path)) return false;
}
// It must not be excluded.
if (_excludes != null && _excludes.contains(id.path)) {
return false;
}
return _inner.isPrimary(id);
}
Future apply(Transform transform) => _inner.apply(transform);
String toString() => _inner.toString();
}