platform/packages/conditionable/README.md

166 lines
3.4 KiB
Markdown
Raw Permalink Normal View History

# Platform Conditionable
A Dart implementation of Laravel's Conditionable trait, providing fluent conditional execution with method chaining.
## Features
- Conditional method execution with `when` and `unless`
- Support for method chaining
- Cascade notation support with `whenThen` and `unlessThen`
- Fallback execution with `orElse` handlers
- Support for both direct values and closure conditions
## Usage
```dart
import 'package:platform_conditionable/platform_conditionable.dart';
// Add the Conditionable mixin to your class
class YourClass with Conditionable {
// Your class implementation
}
```
### Basic Conditional Execution
```dart
class QueryBuilder with Conditionable {
final conditions = <String>[];
void addCondition(String condition) {
conditions.add(condition);
}
}
final query = QueryBuilder();
// Using when
query.when(hasStatus, (self, _) {
(self as QueryBuilder).addCondition("status = 'active'");
});
// Using unless
query.unless(category == null, (self, value) {
(self as QueryBuilder).addCondition("category = '$value'");
});
```
### Method Chaining with Cascade Notation
```dart
class Config with Conditionable {
bool debugMode = false;
List<String> features = [];
}
final config = Config()
..whenThen(
isDevelopment,
() => config.features.add('debug-toolbar'),
)
..unlessThen(
isProduction,
() => config.features.add('detailed-logs'),
);
```
### Using Fallback Handlers
```dart
final result = instance.when(
condition,
(self, value) => 'Primary result',
orElse: (self, value) => 'Fallback result',
);
```
### Closure Conditions
```dart
instance.when(
() => someComplexCondition(),
(self, value) {
// Execute when condition is true
},
);
```
## Features in Detail
### The `when` Method
Executes a callback if the condition is true:
```dart
instance.when(condition, (self, value) {
// Executed if condition is true
});
```
### The `unless` Method
Executes a callback if the condition is false:
```dart
instance.unless(condition, (self, value) {
// Executed if condition is false
});
```
### Cascade Notation with `whenThen` and `unlessThen`
For void operations that work well with cascade notation:
```dart
instance
..whenThen(condition1, () {
// Execute if condition1 is true
})
..unlessThen(condition2, () {
// Execute if condition2 is false
});
```
### Fallback Handling
All methods support fallback execution through `orElse`:
```dart
instance.when(
condition,
(self, value) => 'Primary action',
orElse: (self, value) => 'Fallback action',
);
instance.whenThen(
condition,
() => print('Primary action'),
orElse: () => print('Fallback action'),
);
```
## Example
See the [example](example/platform_conditionable_example.dart) for a complete demonstration of all features, including:
- Conditional query building
- Configuration setup
- Method chaining
- Fallback handlers
- Closure conditions
## Important Notes
1. When using callbacks that need to access the instance methods, cast the `self` parameter to your class type:
```dart
instance.when(condition, (self, value) {
(self as YourClass).someMethod();
});
```
2. The `whenThen` and `unlessThen` methods are designed for void operations and work well with cascade notation.
3. Conditions can be either direct values or closures that return a value.
4. All methods return the instance by default if no callback is provided, enabling method chaining.