platform/packages/config/README.md
2024-12-15 22:51:33 -07:00

3.5 KiB

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:

dependencies:
  platform_config: ^1.0.0

Then run:

dart pub get

Usage

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

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:

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:

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.