buildContext method

Future<Context> buildContext(
  1. String featureName,
  2. Schema schema
)

Builds a Context from a featureName and parsed schema.

Returns an empty context if validation fails. The caller is expected to halt or surface the error to the user.

Single-response mode: response fields are collected into a nested tree with a root node matching the feature name (original behaviour).

Multi-response mode: one EntityContext is built per entry in schema.responses. Each ContextMethod is linked to its named entity via the response key on ApiMethod.

Implementation

Future<Context> buildContext(String featureName, Schema schema) async {
  final projectRoot = Directory.current.path;
  final projectName = await YamlHelper().getProjectName(workingDirectory: projectRoot);

  if (!validateSchema(schema)) {
    return Context(
      name: '',
      nameLowerCase: '',
      nameCamelCase: '',
      isList: false,
      fields: [],
      methods: [],
      generateUseCase: false,
      projectRoot: projectRoot,
      projectName: projectName,
      config: Config(),
    );
  }

  // Use consistent naming across the generated layers.
  final feature = featureName.toPascalCase();
  bool generateUseCase = false;

  final apiMethods = schema.api?.methods?.method ?? {};

  if (schema.isMultiResponse) {
    return _buildMultiResponseContext(
      featureName: featureName,
      feature: feature,
      schema: schema,
      apiMethods: apiMethods,
      projectRoot: projectRoot,
      projectName: projectName,
      generateUseCase: generateUseCase,
    );
  }

  // ── Single-response mode (original behaviour) ──────────────────────────

  final methods = <ContextMethod>[];
  for (var method in apiMethods.entries) {
    final contextMethod = buildContextMethod(method);
    methods.add(contextMethod);
    if (contextMethod.hasUseCase) generateUseCase = true;
  }

  // Response fields become entity/model properties.
  final response = schema.response ?? {};
  final contextFields = <NestedContextField>[];
  final fields = buildContextFields(response, contextFields);
  contextFields.add(NestedContextField(name: feature, properties: fields, isRoot: true));

  return Context(
    name: feature,
    nameLowerCase: featureName.toLowerCase(),
    nameCamelCase: featureName.toCamelCase(),
    isList: schema.isList,
    fields: contextFields,
    methods: methods,
    generateUseCase: generateUseCase,
    projectRoot: projectRoot,
    projectName: projectName,
    config: schema.config ?? Config(),
    isMultiResponse: false,
    entities: [],
  );
}