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 {
  if (element is! ClassElement) {
    throw InvalidGenerationSourceError(
      '`@Envify` can only be used on classes.',
      element: element,
    );
  }

  final el = element;
  final config = Envify(
    name: ifFalsy(annotation.read('name').literalValue as String?, el.name),
    path: ifFalsy(annotation.read('path').literalValue as String?, '.env'),
  );

  final envs = await loadEnvs(config.path, (error) {
    throw InvalidGenerationSourceError(
      error,
      element: el,
    );
  });

  final lines = el.fields.map(
    (field) => generateLine(
      field,
      envs.containsKey(normalize(field.name))
          ? envs[normalize(field.name)]
          : null,
    ),
  );

  return '''
  class _${config.name} {
    ${lines.toList().join()}
  }
  ''';
}