// Copyright (c) 2025, 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 'config.dart'; import 'hooks/syntax.g.dart'; /// The user-defines for [HookInputBuilder.setupShared]. /// /// Currently only holds [workspacePubspec]. (In the future this class will also /// take command-line arguments and a working directory for the command-line /// argument paths to be resolved against.) final class PackageUserDefines { /// User-defines originating from the `pubspec.yaml` in the workspace root. final PackageUserDefinesSource? workspacePubspec; /// Creates a [PackageUserDefines]. PackageUserDefines({required this.workspacePubspec}); @override String toString() => 'PackageUserDefines(workspacePubspec: $workspacePubspec)'; } /// Extension methods for [PackageUserDefines] to convert to and from syntax /// nodes. extension PackageUserDefinesSyntaxExtension on PackageUserDefines { /// Creates a [PackageUserDefines] from a [UserDefinesSyntax] node. static PackageUserDefines fromSyntax(UserDefinesSyntax syntaxNode) => PackageUserDefines( workspacePubspec: switch (syntaxNode.workspacePubspec) { null => null, final o => PackageUserDefinesSourceSyntaxExtension.fromSyntax(o), }, ); /// Converts this [PackageUserDefines] to a [UserDefinesSyntax] node. UserDefinesSyntax toSyntax() { final result = UserDefinesSyntax( workspacePubspec: workspacePubspec?.toSyntax(), ); return result; } } /// A source of user-defines in a [PackageUserDefines]. final class PackageUserDefinesSource { /// The user-defined values. final Map defines; /// The base path for relative paths in [defines]. final Uri basePath; /// Creates a [PackageUserDefinesSource]. PackageUserDefinesSource({required this.defines, required this.basePath}); @override String toString() => 'PackageUserDefinesSource(defines: $defines, basePath: $basePath)'; } /// Extension methods for [PackageUserDefinesSource] to convert to and from /// syntax nodes. extension PackageUserDefinesSourceSyntaxExtension on PackageUserDefinesSource { /// Creates a [PackageUserDefinesSource] from a [UserDefinesSourceSyntax] /// node. static PackageUserDefinesSource fromSyntax( UserDefinesSourceSyntax syntaxNode, ) => PackageUserDefinesSource( defines: syntaxNode.defines.json, basePath: syntaxNode.basePath, ); /// Converts this [PackageUserDefinesSource] to a [UserDefinesSourceSyntax] /// node. UserDefinesSourceSyntax toSyntax() => UserDefinesSourceSyntax( basePath: basePath, defines: JsonObjectSyntax.fromJson(defines), ); }