generateForAnnotatedElement method

  1. @override
Future<String> generateForAnnotatedElement(
  1. Element element,
  2. ConstantReader annotation,
  3. BuildStep buildStep
)

Implement to return source code to generate for element.

This method is invoked based on finding elements annotated with an instance of T. The annotation is provided as a ConstantReader.

Supported return values include a single String or multiple String instances within an Iterable or Stream. It is also valid to return a Future of String, Iterable, or Stream.

Implementations should return null when no content is generated. Empty or whitespace-only String instances are also ignored.

Implementation

@override
Future<String> generateForAnnotatedElement(
  Element element,
  ConstantReader annotation,
  BuildStep buildStep,
) async {
  final objectName = element.name;

  final jsonFilePath = annotation.read('file').stringValue;
  final jsonFileUri = Uri(path: jsonFilePath);

  final jsonAsset = AssetId.resolve(jsonFileUri, from: buildStep.inputId);
  final contents = await buildStep.readAsString(jsonAsset);

  final mergeStrategy = MergeStrategy.nonMatchingToDynamic;
  final decoded = json.decode(contents);

  final dataType = JsonToDataTypeConverter.convert(decoded);

  if (dataType is! ObjectType) {
    // TODO: Handle this exception more gracefully
    throw Exception('JSON file does not contain an object.');
  }

  final result = DartCodeGenerator.generateCodeForObject(
    dataType,
    mergeStrategy: mergeStrategy,
    className: objectName,
  );

  return result;
}