generateExtension function

String generateExtension(
  1. Map<String, EnvVariable> variables,
  2. List<String> allEnvFiles,
  3. ProjectConfig config
)

Implementation

String generateExtension(Map<String, EnvVariable> variables,
    List<String> allEnvFiles, ProjectConfig config) {
  final buffer = StringBuffer();

  buffer.writeln('// GENERATED CODE - DO NOT MODIFY BY HAND');
  buffer.writeln('// Generated on: ${DateTime.now().toIso8601String()}');
  buffer.writeln(
      '// Variables: ${variables.length} from ${allEnvFiles.length} environment files');
  buffer.writeln();

  buffer.writeln(
      'import \'package:flutter_environment_config/flutter_environment_config.dart\';');
  buffer.writeln();

  // Generate the Generation class
  buffer.writeln(
      '/// Type-safe access to environment variables through code generation.');
  buffer.writeln(
      '/// This class provides static-only access and cannot be instantiated.');
  buffer.writeln('abstract class FlutterEnvironmentConfigGeneration {');
  buffer.writeln('  // Private constructor to prevent instantiation');
  buffer.writeln('  FlutterEnvironmentConfigGeneration._();');
  buffer.writeln();

  // Generate getters for each environment variable
  for (final variable in variables.values) {
    final getterName = generateGetterName(variable.key);
    final returnType = variable.type;

    // Generate file availability comment
    final availableFiles = variable.availableInFiles
        .map((f) => f.split('/').last.replaceAll('.example', ''))
        .toList()
      ..sort();
    final allFileNames = allEnvFiles
        .map((f) => f.split('/').last.replaceAll('.example', ''))
        .toList();
    final missingFiles =
        allFileNames.where((f) => !availableFiles.contains(f)).toList();

    buffer.writeln(
        '  /// Gets the value of ${variable.key} environment variable.');
    buffer.writeln('  /// Available in: ${availableFiles.join(', ')}');
    if (missingFiles.isNotEmpty) {
      buffer.writeln('  /// Missing in: ${missingFiles.join(', ')}');
    }
    buffer.writeln('  /// Returns null if not set or invalid.');
    buffer.writeln('  static $returnType? get $getterName {');

    if (returnType == 'bool') {
      buffer.writeln(
          '    final value = FlutterEnvironmentConfig.get(\'${variable.key}\');');
      buffer.writeln('    return value?.toLowerCase() == \'true\';');
    } else if (returnType == 'int') {
      buffer.writeln(
          '    final value = FlutterEnvironmentConfig.get(\'${variable.key}\');');
      buffer.writeln('    return value != null ? int.tryParse(value) : null;');
    } else if (returnType == 'double') {
      buffer.writeln(
          '    final value = FlutterEnvironmentConfig.get(\'${variable.key}\');');
      buffer
          .writeln('    return value != null ? double.tryParse(value) : null;');
    } else {
      // String type
      buffer.writeln(
          '    return FlutterEnvironmentConfig.get(\'${variable.key}\');');
    }

    buffer.writeln('  }');
    buffer.writeln();
  }

  // Generate constants for environment variable keys
  buffer.writeln('  // Environment variable keys');
  for (final variable in variables.values) {
    final constantName = generateConstantName(variable.key);
    buffer
        .writeln('  static const String $constantName = \'${variable.key}\';');
  }

  buffer.writeln('}');

  return buffer.toString();
}