blob: bf72c7de7a02cfc10d7ec62b25cfe9f75acdadca [file]
// Copyright (c) 2026, 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 'js_facet.dart';
import 'meta_facet.dart';
/// Base interface for domain-specific, contractual, or runtime facets attached
/// to an API declaration or library.
abstract interface class ApiFacet implements Comparable<ApiFacet> {
/// The namespace identifying the facet kind (e.g. `'meta'`, `'js'`, `'ffi'`).
String get namespace;
/// Text representation for human-readable parentheticals in `api.txt`.
List<String> get parentheticalSegments;
/// JSON serialization for `api.json`.
Map<String, dynamic> toJson();
/// Deserializes an [ApiFacet] from a JSON map containing a `'namespace'`
/// field.
static ApiFacet fromJson(Map<String, dynamic> json) {
final namespace = json['namespace'] as String?;
return switch (namespace) {
'meta' => MetaContractFacet.fromJson(json),
'js' => JsBindingFacet.fromJson(json),
'js_export' => JsExportFacet.fromJson(json),
_ => throw FormatException('Unknown ApiFacet namespace: "$namespace"'),
};
}
}