Skip to content

refactor: extract (key-press? + key-match?) pattern (25 sites) #5

Description

@ssjoleary

Context

Surfaced by the R3 clj-refactor pass on the Phase 11b Jobs PR (#3). Deliberately out of scope for any of the Wave 1 branches because it's a cross-codebase pattern, not a single track's responsibility.

Pattern

(and (msg/key-press? msg) (msg/key-match? msg "y"))

Always paired — key-press? guards that the message is a keystroke at all; key-match? checks the specific key. The two are never used apart in our code.

Counts

File Instances
src/eca_cli/chat.clj 18
src/eca_cli/state.clj 3
src/eca_cli/picker.clj 3
src/eca_cli/login.clj 1
Total 25

Proposed approach

Introduce a single predicate that takes a message + a key string and returns true when both key-press? and key-match? are true, e.g.

(defn key=? [msg k]
  (and (key-press? msg) (key-match? msg k)))

Probably belongs in whichever namespace currently exposes msg/key-press? and key-match? (likely charm.message — confirm before placing). If those live outside this repo, the helper goes in a local eca-cli.keys (new ns) or alongside the existing dispatch helpers.

Mechanism / policy framing

key=? is pure mechanism: context-free, reusable, easy to test in isolation. The current inline (and ...) boilerplate is mechanism leaking into policy-heavy dispatch tables, making them noisier than necessary.

Out of scope

  • No semantic changes to any dispatch decision — pure refactor.
  • Tests should remain green without modification.
  • Not touching key-press? / key-match? themselves.

Sizing

Single file diff per call-site, mechanical. Maybe 2–3 hours including a clj-refactor pass and lint cleanup. Good candidate for a future parallel-agent wave or a single small PR.

Discovered by

R3 (clj-refactor) agent on the Jobs branch flagged it as "30+ duplications in chat.clj alone" — actual count tighter (25 total across 4 files) but the smell is real.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions