opencode/script/ast-grep/effect-simplifications/rules/no-effect-catch-fail.yml
2026-08-28 17:59:18 -04:00

75 lines
3.9 KiB
YAML

id: no-effect-catch-fail
language: TypeScript
message: Use mapError instead of catching only to fail with a transformed error.
severity: error
rule:
all:
- pattern: $MODULE.catch($$$ARGS)
- any:
- pattern: Effect.catch($$$SELF, ($ERROR) => Effect.fail($MAPPED))
- pattern: Effect.catch($$$SELF, $ERROR => Effect.fail($MAPPED))
- pattern: Effect.catch($$$SELF, ($ERROR) => { return Effect.fail($MAPPED) })
- pattern: Effect.catch($$$SELF, $ERROR => { return Effect.fail($MAPPED) })
- pattern: "Effect.catch($$$SELF, ($ERROR): Effect.Effect<$_SUCCESS, $ERROR_TYPE> => Effect.fail($MAPPED))"
- pattern: "Effect.catch($$$SELF, ($ERROR): Effect.Effect<$_SUCCESS, $ERROR_TYPE> => { return Effect.fail($MAPPED) })"
- pattern: "Effect.catch($$$SELF, ($ERROR): Effect.Effect<$_SUCCESS, $ERROR_TYPE, $_REQUIREMENTS> => Effect.fail($MAPPED))"
- pattern: "Effect.catch($$$SELF, ($ERROR): Effect.Effect<$_SUCCESS, $ERROR_TYPE, $_REQUIREMENTS> => { return Effect.fail($MAPPED) })"
- pattern: Stream.catch($$$SELF, ($ERROR) => Stream.fail($MAPPED))
- pattern: Stream.catch($$$SELF, $ERROR => Stream.fail($MAPPED))
- pattern: Stream.catch($$$SELF, ($ERROR) => { return Stream.fail($MAPPED) })
- pattern: Stream.catch($$$SELF, $ERROR => { return Stream.fail($MAPPED) })
- pattern: "Stream.catch($$$SELF, ($ERROR): Stream.Stream<$_SUCCESS, $ERROR_TYPE> => Stream.fail($MAPPED))"
- pattern: "Stream.catch($$$SELF, ($ERROR): Stream.Stream<$_SUCCESS, $ERROR_TYPE> => { return Stream.fail($MAPPED) })"
- pattern: "Stream.catch($$$SELF, ($ERROR): Stream.Stream<$_SUCCESS, $ERROR_TYPE, $_REQUIREMENTS> => Stream.fail($MAPPED))"
- pattern: "Stream.catch($$$SELF, ($ERROR): Stream.Stream<$_SUCCESS, $ERROR_TYPE, $_REQUIREMENTS> => { return Stream.fail($MAPPED) })"
- not:
pattern: $MODULE.catch($_FIRST, $_SECOND, $$$REST)
constraints:
MAPPED:
not:
any:
- kind: identifier
- kind: parenthesized_expression
rewriters:
- id: unwrap-effect-fail-with-return-type
rule:
any:
- pattern: "($ERROR): Effect.Effect<$_SUCCESS, $ERROR_TYPE> => Effect.fail($MAPPED)"
- pattern: "($ERROR): Effect.Effect<$_SUCCESS, $ERROR_TYPE> => { return Effect.fail($MAPPED) }"
- pattern: "($ERROR): Effect.Effect<$_SUCCESS, $ERROR_TYPE, $_REQUIREMENTS> => Effect.fail($MAPPED)"
- pattern: "($ERROR): Effect.Effect<$_SUCCESS, $ERROR_TYPE, $_REQUIREMENTS> => { return Effect.fail($MAPPED) }"
fix: "($ERROR): $ERROR_TYPE => $MAPPED"
- id: unwrap-stream-fail-with-return-type
rule:
any:
- pattern: "($ERROR): Stream.Stream<$_SUCCESS, $ERROR_TYPE> => Stream.fail($MAPPED)"
- pattern: "($ERROR): Stream.Stream<$_SUCCESS, $ERROR_TYPE> => { return Stream.fail($MAPPED) }"
- pattern: "($ERROR): Stream.Stream<$_SUCCESS, $ERROR_TYPE, $_REQUIREMENTS> => Stream.fail($MAPPED)"
- pattern: "($ERROR): Stream.Stream<$_SUCCESS, $ERROR_TYPE, $_REQUIREMENTS> => { return Stream.fail($MAPPED) }"
fix: "($ERROR): $ERROR_TYPE => $MAPPED"
- id: unwrap-effect-fail
rule:
any:
- pattern: ($ERROR) => Effect.fail($MAPPED)
- pattern: $ERROR => Effect.fail($MAPPED)
- pattern: ($ERROR) => { return Effect.fail($MAPPED) }
- pattern: $ERROR => { return Effect.fail($MAPPED) }
fix: ($ERROR) => $MAPPED
- id: unwrap-stream-fail
rule:
any:
- pattern: ($ERROR) => Stream.fail($MAPPED)
- pattern: $ERROR => Stream.fail($MAPPED)
- pattern: ($ERROR) => { return Stream.fail($MAPPED) }
- pattern: $ERROR => { return Stream.fail($MAPPED) }
fix: ($ERROR) => $MAPPED
transform:
MAPPED_ARGS:
rewrite:
rewriters:
- unwrap-effect-fail-with-return-type
- unwrap-stream-fail-with-return-type
- unwrap-effect-fail
- unwrap-stream-fail
source: $$$ARGS
fix: $MODULE.mapError($MAPPED_ARGS)