onGenerate method

  1. @override
Future<$BuildOutput> onGenerate(
  1. ArtifactBuilder builder,
  2. ClassElement clazz,
  3. ConstructorElement ctor,
  4. List<FormalParameterElement> params,
  5. BuildStep step,
  6. List<String>? eFields,
)
override

Implementation

@override
Future<$BuildOutput> onGenerate(
  ArtifactBuilder builder,
  ClassElement clazz,
  ConstructorElement ctor,
  List<FormalParameterElement> params,
  BuildStep step,
  List<String>? eFields,
) async {
  StringBuffer buf = StringBuffer();
  List<Uri> importUris = <Uri>[];
  LibraryElement targetLib = clazz.library;

  buf.writeln(
    "  ${builder.applyDefsF("ArtifactModelExporter")} get to=>${builder.applyDefsF("ArtifactModelExporter")}(toMap);",
  );

  buf.write("  ${builder.applyDefsF("Map<String,dynamic>")} toMap(){");
  buf.write("_;");

  List<String> subs = builder.subclassesOf(clazz);
  if (subs.isNotEmpty) {
    for (String sub in subs) {
      buf.write('if (_H is ${builder.applyDefsF(sub)}){');
      buf.write('return (_H as ${builder.applyDefsF(sub)}).toMap();');
      buf.write('}');
    }
  }

  buf.write("return");

  if (eFields != null) {
    buf.write(" ${builder.applyDefsF("ArtifactSecurityUtil")}.q(");
  }

  buf.write(
    '<${builder.applyDefsF("String")},${builder.applyDefsF("dynamic")}>{',
  );

  InterfaceType? supType = clazz.supertype;
  while (supType != null) {
    ClassElement sup = supType.element as ClassElement;
    if (ArtifactBuilder.$artifactChecker.hasAnnotationOf(
      sup,
      throwOnUnresolved: false,
    )) {
      buf.write("${builder.stringD(subclassTagFor(sup))}: '${clazz.name}',");
    }
    supType = supType.element.supertype;
  }

  for (FormalParameterElement param in params) {
    String name = paramName(param);

    ({String code, List<Uri> imports}) conv = builder.guardGeneration(
      clazz: clazz,
      stage: "to_map.convert",
      param: param,
      run:
          () => builder.converter.$convert(
            name,
            param.type,
            targetLib,
            $ArtifactConvertMode.toMap,
          ),
    );

    String rn = builder.guardGeneration(
      clazz: clazz,
      stage: "to_map.rename",
      param: param,
      run: () => builder.renamedParamName(clazz, param),
    );

    buf.write("${builder.stringD(rn)}:${conv.code.trim()},");
    importUris.addAll(conv.imports);
  }

  buf.write('}.\$nn');

  if (eFields != null) {
    buf.write(
      ",[${eFields.map((i) => builder.stringD(i)).join(",")}],\$artifactCipher);",
    );
  } else {
    buf.write(';');
  }

  buf.writeln('}');

  return (importUris, buf);
}