# Platform Config

A Dart implementation of Laravel-inspired configuration management for the Protevus platform.

## Features

- Flexible configuration storage and retrieval
- Support for nested configuration keys
- Type-safe retrieval methods (string, integer, float, boolean, array)
- Implementation of Dart's `Map` interface for familiar usage
- Macro system for extending functionality at runtime

## Installation

Add this package to your `pubspec.yaml`:

```yaml
dependencies:
  platform_config: ^1.0.0
```

Then run:

```
dart pub get
```

## Usage

Here's a basic example of how to use the `Repository` class:

```dart
import 'package:platform_config/platform_config.dart';

void main() {
  final config = Repository({
    'app': {
      'name': 'My App',
      'debug': true,
    },
    'database': {
      'default': 'mysql',
      'connections': {
        'mysql': {
          'host': 'localhost',
          'port': 3306,
        },
      },
    },
  });

  // Get a value
  print(config.get('app.name')); // Output: My App

  // Get a typed value
  final isDebug = config.boolean('app.debug');
  print(isDebug); // Output: true

  // Get a nested value
  final dbPort = config.integer('database.connections.mysql.port');
  print(dbPort); // Output: 3306

  // Set a value
  config.set('app.version', '1.0.0');

  // Check if a key exists
  print(config.has('app.version')); // Output: true

  // Get multiple values
  final values = config.getMany(['app.name', 'app.debug']);
  print(values); // Output: {app.name: My App, app.debug: true}
}
```

### Available Methods

- `get<T>(String key, [T? defaultValue])`: Get a value by key, optionally specifying a default value.
- `set(dynamic key, dynamic value)`: Set a value for a key.
- `has(String key)`: Check if a key exists in the configuration.
- `string(String key, [String? defaultValue])`: Get a string value.
- `integer(String key, [int? defaultValue])`: Get an integer value.
- `float(String key, [double? defaultValue])`: Get a float value.
- `boolean(String key, [bool? defaultValue])`: Get a boolean value.
- `array(String key, [List<dynamic>? defaultValue])`: Get an array value.
- `getMany(List<String> keys)`: Get multiple values at once.
- `all()`: Get all configuration items.
- `prepend(String key, dynamic value)`: Prepend a value to an array.
- `push(String key, dynamic value)`: Append a value to an array.

The `Repository` class also implements Dart's `Map` interface, so you can use it like a regular map:

```dart
config['new.key'] = 'new value';
print(config['new.key']); // Output: new value
```

## Error Handling

The type-safe methods (`string()`, `integer()`, `float()`, `boolean()`, `array()`) will throw an `ArgumentError` if the value at the specified key is not of the expected type.

## Extending Functionality

You can extend the `Repository` class with custom methods using the macro system:

```dart
Repository.macro('getConnectionUrl', (Repository repo, String connection) {
  final conn = repo.get('database.connections.$connection');
  return 'mysql://${conn['username']}:${conn['password']}@${conn['host']}:${conn['port']}/${conn['database']}';
});

final config = Repository(/* ... */);
final mysqlUrl = config.callMacro('getConnectionUrl', ['mysql']);
print(mysqlUrl); // Output: mysql://user:password@localhost:3306/dbname
```

## Testing

To run the tests for this package, use the following command:

```
dart test
```

## Contributing

Contributions are welcome! Please read our contributing guidelines before submitting pull requests.

## License

This project is licensed under the MIT License.