define method

void define(
  1. Map<String, EnvSchema<ErrorReporter>> schema, {
  2. Directory? root,
  3. bool includeDartEnv = true,
})

Validates environment variables against a schema.

Takes a schema defining the expected structure and validation rules for environment variables, and data containing the actual environment variable values to validate.

Returns a Map containing the validated environment variables. The returned map will have the same keys as the schema, with values converted and validated according to the schema rules.

Throws an EnvGuardException if any validation errors occur. The exception will contain details about which validations failed.

Example:

final schema = {
  'PORT': env.number().integer(),
  'HOST': env.string(),
};

final data = {
  'PORT': '8080',
  'HOST': 'localhost'
};

final validated = env.validate(schema, data);
// Returns: {'PORT': 8080, 'HOST': 'localhost'}

Implementation

void define(
  Map<String, EnvSchema> schema, {
  Directory? root,
  bool includeDartEnv = true,
}) {
  final loader = Loader(root ?? Directory.current);

  if (includeDartEnv) {
    _environments.addEntries(Platform.environment.entries);
  }

  if (!_environments.containsKey('DART_ENV')) {
    _environments['DART_ENV'] = String.fromEnvironment(
      'DART_ENV',
      defaultValue: 'development',
    );
  }

  final envs = loader.load();
  final target = '.env.${_environments['DART_ENV']}';

  EnvEntry? current =
      envs.where((element) => element.name == target).firstOrNull;
  current ??= envs.where((element) => element.name == '.env').firstOrNull;

  final Map<String, dynamic> validated = {};
  if (current != null) {
    final values = _envParser.parse(current.content);
    for (final element in schema.entries) {
      if (element.key != 'DART_ENV' &&
          _environments.containsKey(element.key)) {
        throw Exception('Environment variable ${element.key} already exists');
      }
    }

    validated.addAll(validate(schema, values));
  } else {
    validated.addAll(validate(schema, _environments));
  }

  for (final element in validated.entries) {
    _environments[element.key] = element.value;
  }
}