bind method

Converts framework route parameters into their declared typed keys.

Implementation

Map<AuthRouteParameterKey, String> bind(Map<String, Object?> values) {
  validate();
  final byName = <String, AuthRouteParameterKey>{
    for (final parameter in parameters) parameter.name: parameter,
  };
  final supplied = values.keys.toSet();
  final expected = byName.keys.toSet();
  final missing = expected.difference(supplied);
  final extra = supplied.difference(expected);
  if (missing.isNotEmpty || extra.isNotEmpty) {
    throw ArgumentError.value(
      values,
      'values',
      'must exactly match route parameters; missing: ${missing.join(', ')}, '
          'extra: ${extra.join(', ')}',
    );
  }
  final bound = <AuthRouteParameterKey, String>{};
  for (final entry in values.entries) {
    final value = entry.value?.toString();
    if (value == null || value.isEmpty) {
      throw ArgumentError.value(value, entry.key, 'must not be empty');
    }
    bound[byName[entry.key]!] = value;
  }
  return Map<AuthRouteParameterKey, String>.unmodifiable(bound);
}