// Copyright (c) 2019, 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 '../package_config.dart'; /// General superclass of most errors and exceptions thrown by this package. /// /// Only covers errors thrown while parsing package configuration files. /// Programming errors and I/O exceptions are not covered. abstract class PackageConfigError { PackageConfigError._(); } class PackageConfigArgumentError extends ArgumentError implements PackageConfigError { PackageConfigArgumentError( Object? super.value, String super.name, String super.message, ) : super.value(); PackageConfigArgumentError.from(ArgumentError error) : super.value(error.invalidValue, error.name, error.message); } class PackageConfigFormatException extends FormatException implements PackageConfigError { PackageConfigFormatException( super.message, Object? super.source, [ super.offset, ]); PackageConfigFormatException.from(FormatException exception) : super(exception.message, exception.source, exception.offset); } /// Exception reported when finding a configuration with an unaccepted version. /// /// Used by [findPackageConfig] and similar functions if specifying a /// `minVersion`, or by parsing if finding a package configuration file /// with a version that is not in the range /// [PackageConfig.minVersion]..[PackageConfig.maxVersion]. abstract class PackageConfigVersionException { abstract final int actualVersion; abstract final int? minVersion; abstract final int? maxVersion; factory PackageConfigVersionException.clientLimit( int actualVersion, int? minVersion, int? maxVersion, ) = _PackageConfigVersionFormatException; factory PackageConfigVersionException.supportedLimit( int actualVersion, String keyName, ) = _PackageConfigVersionArgumentError; static String _rangeMessage(int actual, int? minVersion, int? maxVersion) { String errorMessage; if (minVersion != null) { if (maxVersion != null) { errorMessage = minVersion == maxVersion ? 'Must be $minVersion' : 'Must be in the range $minVersion..$maxVersion'; } else { errorMessage = 'Must be at least $minVersion'; } } else if (maxVersion != null) { errorMessage = 'Must be at most $maxVersion'; } else { errorMessage = 'Not accepted'; } return 'Configuration version $actual: $errorMessage'; } } /// Error when configuration specifies an unsupported configuration version. class _PackageConfigVersionArgumentError extends PackageConfigArgumentError implements PackageConfigVersionException { _PackageConfigVersionArgumentError(int actualVersion, String name) : super( actualVersion, name, PackageConfigVersionException._rangeMessage( actualVersion, PackageConfig.minVersion, PackageConfig.maxVersion, ), ); @override int get actualVersion => super.invalidValue as int; @override int get minVersion => PackageConfig.minVersion; @override int get maxVersion => PackageConfig.maxVersion; } /// Exception when found configuration doesn't match client's set limits. class _PackageConfigVersionFormatException extends PackageConfigFormatException implements PackageConfigVersionException { @override final int actualVersion; @override final int? minVersion; @override final int? maxVersion; _PackageConfigVersionFormatException( this.actualVersion, this.minVersion, this.maxVersion, ) : super( PackageConfigVersionException._rangeMessage( actualVersion, minVersion, maxVersion, ), null, ); } /// The default `onError` handler. // ignore: only_throw_errors Never throwError(Object error, [Object? _]) => throw error;