buildContextMethod method

ContextMethod buildContextMethod(
  1. MapEntry<String, ApiMethod> method, {
  2. Set<String>? validResponseKeys,
})

Converts an ApiMethod schema entry into a ContextMethod.

Params/body/query sections are expanded into nested field trees that can generate request models. The hasUseCase flag is derived from the presence of any params/body/query.

validResponseKeys is supplied in multi-response mode so the method's response key can be validated and resolved to entity name strings.

Implementation

ContextMethod buildContextMethod(
  MapEntry<String, ApiMethod> method, {
  Set<String>? validResponseKeys,
}) {
  final paramsFields = <NestedContextField>[],
      bodyFields = <NestedContextField>[],
      queryFields = <NestedContextField>[];

  final params = buildContextFields(method.value.params ?? {}, paramsFields);
  final body = buildContextFields(method.value.body ?? {}, bodyFields);
  final query = buildContextFields(method.value.query ?? {}, queryFields);

  if (params.isNotEmpty) {
    paramsFields.add(
      NestedContextField(
        name: method.key.camelCaseToPascalCase(),
        properties: params,
        isRoot: true,
      ),
    );
  }
  if (body.isNotEmpty) {
    bodyFields.add(
      NestedContextField(
        name: method.key.camelCaseToPascalCase(),
        properties: body,
        isRoot: true,
      ),
    );
  }
  if (query.isNotEmpty) {
    queryFields.add(
      NestedContextField(
        name: method.key.camelCaseToPascalCase(),
        properties: query,
        isRoot: true,
      ),
    );
  }

  // Resolve response entity reference (multi-response mode only).
  String? responseEntityName;
  String? responseEntityNameLower;
  String? responseEntityCamelCase;
  bool responseIsList = method.value.responseIsList;
  bool hasResponse = false;

  final rawResponse = method.value.response;
  if (rawResponse != null && validResponseKeys != null) {
    if (validResponseKeys.contains(rawResponse)) {
      responseEntityName = rawResponse.toPascalCase();
      responseEntityNameLower = rawResponse.toLowerCase();
      responseEntityCamelCase = rawResponse.toCamelCase();
      hasResponse = true;
    } else {
      _commandHelper.warning(
        'Method "${method.key}" declares response "$rawResponse" which is not defined in the '
        '"response" section. It will be treated as void.',
      );
    }
  }

  return ContextMethod(
    methodName: method.key,
    methodNamePascalCase: method.key.camelCaseToPascalCase(),
    params: paramsFields,
    body: bodyFields,
    query: queryFields,
    hasParams: paramsFields.isNotEmpty,
    hasBody: bodyFields.isNotEmpty,
    hasQuery: queryFields.isNotEmpty,
    hasUseCase: paramsFields.isNotEmpty || bodyFields.isNotEmpty || queryFields.isNotEmpty,
    responseEntityName: responseEntityName,
    responseEntityNameLower: responseEntityNameLower,
    responseEntityCamelCase: responseEntityCamelCase,
    responseIsList: responseIsList,
    hasResponse: hasResponse,
  );
}