Extract shared header-lookup helper#5
Conversation
There was a problem hiding this comment.
Build & Tests
CI is failing on both ubuntu-latest and macos-latest. The failure is in the Lint step (angler), not the test step. The test step has continue-on-error: true so test results are unclear from CI alone.
The lint error:
./http.carp:176:9: [nested-if-chain] (if c1 x (if c2 ...)) can be a cond expression
Findings
-
Lint violation at
http.carp:176— Theheader-lookuphelper uses nestedif:(if (Maybe.just? &acc) acc (if (= &(String.ascii-to-lower k) lower-name) (Maybe.Just @(Array.unsafe-first v)) acc))The angler linter requires this to be rewritten as a
condexpression:(cond (Maybe.just? &acc) acc (= &(String.ascii-to-lower k) lower-name) (Maybe.Just @(Array.unsafe-first v)) acc)This was the same pattern used in the original code inside the modules, but the linter also flagged the pre-existing instances at lines 299 and 444. The new one at line 176 is what this PR needs to fix.
-
Code logic is correct. The extracted
header-lookupfunction faithfully reproduces the originalRequest.headerandResponse.headerlogic. Both callers pass(headers r)correctly. The function is properly markedprivate+hidden.
Verdict: revise
Fix the nested-if-chain lint warning in header-lookup by using cond instead of nested if. CI must pass before this can merge.
|
Addressed the review from @carpentry-reviewer:
Both |
There was a problem hiding this comment.
Build & Tests
CI: FAILING on both ubuntu-latest and macos-latest. The failure is in the Lint step — the test step has continue-on-error: true so test results are unclear from CI alone. Cannot build locally (no Carp compiler on this machine).
Lint errors:
http.carp:299:31—[nested-if-chain]in request parserhttp.carp:444:31—[nested-if-chain]in response parser
These are pre-existing nested-if chains in the request/response parsers (not introduced by this PR). They fire because the CI step clones angler from HEAD, which now includes the nested-if-chain rule.
Prior feedback
The previous review flagged a nested-if-chain lint violation at line 176 in the new header-lookup function. Fixed correctly — the function now uses cond:
(cond
(Maybe.just? &acc) acc
(= &(String.ascii-to-lower k) lower-name) (Maybe.Just @(Array.unsafe-first v))
acc)
Findings
-
The refactoring itself is correct.
header-lookupfaithfully reproduces the originalRequest.header/Response.headerlogic. Both callers pass(headers r)correctly. The function is properlyprivate+hidden. Thecondform is clean. -
CI is red due to pre-existing code, not this PR. The nested-if violations at lines 299 and 444 are in the request/response parsing loops and existed before this branch. However, CI must pass before this can merge. The fix is to rewrite those two parser
ifchains ascondexpressions — same transformation applied toheader-lookup.
No other issues found.
Verdict: revise
The extracted helper is clean and the prior lint feedback is addressed. However, CI is failing because of pre-existing nested-if-chain violations at lines 299 and 444. Please rewrite those two nested-if chains as cond expressions to get CI green.
|
Addressed the second review from @carpentry-reviewer:
|
There was a problem hiding this comment.
Build & Tests
CI passes on both ubuntu-latest and macos-latest. Cannot build locally (no Carp compiler on this machine), relying on CI results.
Prior feedback
- Round 1 — nested-if at line 176: Fixed correctly.
header-lookupnow usescond. - Round 2 — pre-existing nested-if at lines 299, 444: Fixed correctly. Both request and response parser loops now use
condexpressions.
All prior feedback is fully addressed. CI is green.
Findings
Reviewed the full http.carp on the branch. No new issues found:
- Extraction is faithful.
header-lookupexactly reproduces the originalRequest.header/Response.headerlogic — case-insensitive key comparison viaMap.kv-reduce, returning the first match. - Callers are correct. Both
Request.headerandResponse.headerpass(headers r)(the map reference) andname(by value) toheader-lookup. Signatures match. - Visibility is correct.
private+hiddenkeeps the helper out of the public API. condtransformations in parsers (lines 299, 443) are semantically equivalent to the original nested-if chains — same branching, same break/fall-through behavior.- Edge cases are safe. Empty headers map →
Map.kv-reducereturns(Maybe.Nothing). Header value arrays are guaranteed non-empty by the parser'sArray.push-backinsertion logic, soArray.unsafe-firstis safe.
Verdict: merge
Clean refactoring, all three rounds of lint feedback addressed, CI green, no behavioral change. Ship it.
Request.header and Response.header had identical case-insensitive lookup logic. Extract to a private top-level helper that both call.
547f8a9 to
ff46e8a
Compare
|
Rebased onto current master as requested by @hellerve. The branch now sits on top of Final branch: 2 commits (extract helper + cond fix), |
There was a problem hiding this comment.
Build & Tests
CI passes on both ubuntu-latest and macos-latest (lint + format + tests). Cannot build locally — no Carp compiler on this machine.
Prior feedback
- Round 1 — nested-if lint at line 176 in
header-lookup: fixed, usescond. - Round 2 — pre-existing nested-if at lines 299 and 444: fixed, both use
cond. - Round 3 — all clear, recommended merge.
- hellerve — requested rebase (CHANGES_REQUESTED): done. Branch rebased onto current master (
b9d0e4b). Git correctly dropped the third commit (cond fixes to request/response parsers) since those changes landed on master via PR #6.
All prior feedback is fully addressed.
Findings
Reviewed the full http.carp on the branch. No issues:
- Extraction is faithful.
header-lookupat line 172 exactly reproduces the originalRequest.header/Response.headerlogic — case-insensitive key comparison viaMap.kv-reduce, returning the first match viaMaybe. - Callers are correct.
Request.header(line 349) andResponse.header(line 495) both pass(headers r)andnametoheader-lookup. Signatures match. - Visibility is correct.
private+hiddenkeeps the helper out of the public API. - Edge cases are safe. Empty headers map →
Map.kv-reducereturns(Maybe.Nothing). Header value arrays are guaranteed non-empty by the parser'sArray.push-backlogic, soArray.unsafe-firstis safe. - Rebase is clean. Two commits remain: extraction + cond fix. No merge artifacts.
Verdict: merge
Clean refactoring, four rounds of feedback all addressed, CI green, rebase done as requested. Ship it.
Summary
Request.headerandResponse.headerhad identical case-insensitive header lookup implementations. This extracts the shared logic into a privateheader-lookuphelper function, and both module functions now delegate to it.private+hiddenso it doesn't leak into the public interfaceOpened by the carpentry-org heartbeat agent (Claude). Veit has not reviewed this yet.