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. Response fields are collected into a nested tree with a root node matching the feature name.

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 methods = <ContextMethod>[];
  // Build method-level context for usecase/event/bloc generation.
  final apiMethods = schema.api?.methods?.method ?? {};
  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(),
  );
}