isConformingNamespaces static method

void isConformingNamespaces(
  1. Map<String, RequiredNamespace> requiredNamespaces,
  2. Map<String, Namespace> namespaces,
  3. String context
)

Implementation

static void isConformingNamespaces(
  Map<String, RequiredNamespace> requiredNamespaces,
  Map<String, Namespace> namespaces,
  String context,
) {
  List<String> requiredNamespaceKeys = requiredNamespaces.keys.toList();
  List<String> namespaceKeys = namespaces.keys.toList();

  if (!hasOverlap(requiredNamespaceKeys, namespaceKeys)) {
    throw Errors.getInternalError(
      Errors.NON_CONFORMING_NAMESPACES,
      context: "$context namespaces keys don't satisfy requiredNamespaces",
    );
  } else {
    requiredNamespaceKeys.forEach((key) {
      List<dynamic> requiredNamespaceChains = requiredNamespaces[key]!.chains;
      List<dynamic> namespaceChains = NamespaceUtils.getAccountsChains(
        namespaces[key]!.accounts,
      );

      if (!hasOverlap(requiredNamespaceChains, namespaceChains)) {
        throw Errors.getInternalError(
          Errors.NON_CONFORMING_NAMESPACES,
          context:
              "$context namespaces accounts don't satisfy requiredNamespaces chains for $key",
        );
      } else if (!hasOverlap(
          requiredNamespaces[key]!.methods, namespaces[key]!.methods)) {
        throw Errors.getInternalError(
          Errors.NON_CONFORMING_NAMESPACES,
          context:
              "$context namespaces methods don't satisfy requiredNamespaces methods for $key",
        );
      } else if (!hasOverlap(
          requiredNamespaces[key]!.events, namespaces[key]!.events)) {
        throw Errors.getInternalError(
          Errors.NON_CONFORMING_NAMESPACES,
          context:
              "$context namespaces events don't satisfy requiredNamespaces events for $key",
        );
      }

      // Check each required extension
      if (requiredNamespaces[key]!.extension != null) {
        for (var requiredExt in requiredNamespaces[key]!.extension!) {
          // Make sure that some extension in the namespaces satisfies it
          if (namespaces[key]!.extension != null) {
            for (var ext in namespaces[key]!.extension!) {
              List<dynamic> accChains = NamespaceUtils.getAccountsChains(
                ext.accounts,
              );
              // If the required extension is satisfied, break out of the loop so we don't throw
              if (hasOverlap(requiredExt.chains, accChains) &&
                  hasOverlap(requiredExt.events, ext.events) &&
                  hasOverlap(requiredExt.methods, ext.methods)) {
                break;
              }
            }
          }

          throw Errors.getInternalError(
            Errors.NON_CONFORMING_NAMESPACES,
            context:
                "$context namespaces extension doesn't satisfy requiredNamespaces extension for $key",
          );
        }
      }
    });
  }
}