buildContextMethod method
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,
);
}