buildContext method

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

Builds a Context from a featureName and parsed schema.

Throws a StateError if validation fails — callers should not continue after this. In production CommandHelper.error already exits the process before the throw is reached; in tests the throw surfaces the failure.

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)) {
    throw StateError(
      'Schema validation failed for feature "$featureName". '
      'See errors above for details.',
    );
  }

  // 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 ?? const Config(),
    isMultiResponse: false,
    entities: [],
  );
}