Initial commit
This commit is contained in:
85
skills/result-simple/SKILL.md
Normal file
85
skills/result-simple/SKILL.md
Normal file
@@ -0,0 +1,85 @@
|
||||
---
|
||||
name: result-simple-perl
|
||||
description: Use Result::Simple for tuple-based error handling in Perl
|
||||
version: 1.0.0
|
||||
author: kfly8
|
||||
tags: [perl, cpan, error-handling, result-type]
|
||||
---
|
||||
|
||||
# Result::Simple - Tuple-based Error Handling
|
||||
|
||||
Result::Simple provides lightweight error handling using tuples `($value, $error)` instead of objects.
|
||||
|
||||
## Core Functions
|
||||
|
||||
### `ok($value)` / `err($error)`
|
||||
```perl
|
||||
use Result::Simple qw(ok err);
|
||||
|
||||
sub divide {
|
||||
my ($a, $b) = @_;
|
||||
return err('Division by zero') if $b == 0;
|
||||
return ok($a / $b);
|
||||
}
|
||||
|
||||
my ($result, $error) = divide(10, 2);
|
||||
if ($error) {
|
||||
warn "Error: $error";
|
||||
} else {
|
||||
print "Result: $result";
|
||||
}
|
||||
```
|
||||
|
||||
## Practical Examples
|
||||
|
||||
### Error Chaining Pattern
|
||||
```perl
|
||||
sub process_config {
|
||||
my $filename = shift;
|
||||
|
||||
my ($content, $read_error) = read_file($filename);
|
||||
return (undef, $read_error) if $read_error;
|
||||
|
||||
my $data = eval { decode_json($content) };
|
||||
return err("JSON error: $@") if $@;
|
||||
|
||||
return ok($data);
|
||||
}
|
||||
```
|
||||
|
||||
### Type Checking with result_for
|
||||
```perl
|
||||
use Result::Simple qw(ok err result_for);
|
||||
use Types::Standard qw(Dict Str);
|
||||
use Types::Common::Numeric qw(PositiveInt);
|
||||
use kura Error => Dict[message => Str];
|
||||
|
||||
# result_for requires structured error type (not plain string)
|
||||
result_for calculate => PositiveInt, Error;
|
||||
|
||||
sub calculate {
|
||||
my ($a, $b) = @_;
|
||||
# Error must be structured (HashRef)
|
||||
return err({ message => 'Invalid input' }) if $a < 0;
|
||||
return ok($a * $b);
|
||||
}
|
||||
|
||||
# Set RESULT_SIMPLE_CHECK_ENABLED=1 to activate type checking
|
||||
# $ENV{RESULT_SIMPLE_CHECK_ENABLED} = 1;
|
||||
|
||||
my ($result, $error) = calculate(5, 3);
|
||||
if ($error) {
|
||||
warn "Error: $error->{message}";
|
||||
} else {
|
||||
print "Result: $result"; # 15
|
||||
}
|
||||
|
||||
# Type checking works when RESULT_SIMPLE_CHECK_ENABLED=1
|
||||
# calculate(5.5, 3); # Dies: Invalid success result (Float instead of PositiveInt)
|
||||
```
|
||||
|
||||
**Important**: `result_for` requires:
|
||||
- Type::Tiny objects (not string type names)
|
||||
- Structured error type (use `Dict[...]` with kura)
|
||||
- Environment variable `RESULT_SIMPLE_CHECK_ENABLED=1` for runtime checking
|
||||
|
||||
Reference in New Issue
Block a user