generate method

Future<Library> generate()

generates code_builder structures that can still be modified

Implementation

Future<Library> generate() async {
  final db = await GeneratorDatabase.fromConfig(config);

  final jsonConverters = JsonConverters();
  final typeCreator = TypeCreator([
    const KnownTypeHandler(),
    const GenericTypeHandler(),
    InternalTypeHandler(db),
  ]);
  const valueCreator = ValueCreator();
  const errorCreator = ErrorCreator();
  const attributeCreator = AttributeCreator(valueCreator);
  final statementCreator = StatementCreator([
    DtoHandler(
      typeCreator,
      valueCreator,
      attributeCreator,
      jsonConverters,
      db,
    ),
    QueryHandler(
      typeCreator,
      valueCreator,
      attributeCreator,
      jsonConverters,
      db,
    ),
    CommandHandler(
      typeCreator,
      valueCreator,
      attributeCreator,
      jsonConverters,
      db,
      errorCreator,
    ),
    EnumHandler(
      typeCreator,
      valueCreator,
      attributeCreator,
      jsonConverters,
      db,
    ),
  ]);

  final body = [
    for (final statement in db.statements)
      if (db.shouldInclude(statement.name) && !db.isAttribute(statement))
        statementCreator.create(statement)
  ];

  // TODO: knownGroups?
  // TODO: projectName?

  return Library(
    (l) => l
      ..body.addAll([
        const Code(header),
        Library(
          (l) => l
            ..body.addAll([
              Code(config.directives),
              Code("part '${config.name}.g.dart';"),
              Code('\n\n${config.extra}\n\n'),
              ...jsonConverters.converters,
              timeClass,
              ...body,
            ])
            ..directives.addAll([
              Directive.import('package:cqrs/contracts.dart'),
              Directive.import(
                'package:json_annotation/json_annotation.dart',
              ),
              Directive.import('package:equatable/equatable.dart'),
            ]),
        ),
      ]),
  );
}