# ADR: Implement extractPathParams in CommonHtmxRoute Date: 2025-08-22 ## Context We use a lightweight HTTP routing based on Go 1.22+ pattern-based ServeMux. Our route paths include placeholders in braces, such as `/en/events/{id}`. The HtmxContext provides a `GetPathParam(key string)` method that uses the request’s `PathValue(key)` to retrieve values for path parameters. The `CommonHtmxRoute` type already supports building URLs by replacing placeholders via `ToUrl`. However, the reverse operation — extracting path params from the template to build a `[]HtmxPathParam` based on the current request — had an unimplemented stub: `extractPathParams`. ## Decision Implement `extractPathParams` to: - Parse the language-specific path template for placeholders of the form `{name}`. - Collect unique placeholder names in order of appearance. - For each placeholder name, call `c.GetPathParam(name)` to obtain its value from the current request context. - Return the slice of `HtmxPathParam{Key: name, Value: value}`. This creates a consistent source of truth for path parameters both when generating URLs and when reading them from incoming requests. ## Implementation - File: `ersteller-lib/htmx_route.go` - Function: `CommonHtmxRoute.extractPathParams(c HtmxContext) []HtmxPathParam` - Approach: String scanning to find `{` and `}` pairs, trimming and deduplicating keys; for each key, append `HtmxPathParam{Key: key, Value: c.GetPathParam(key)}` to the results. - No external dependencies added. ## Alternatives Considered - Using a regex like `\{([^}]+)\}`. Rejected to avoid introducing a regex dependency and to keep the implementation minimal and allocation-light. - Parsing the actual request path rather than the template. Rejected because placeholder names must come from the template, and values come from `GetPathParam`. ## Trade-offs - The simple scanner assumes non-nested, well-formed placeholders and does not validate balanced braces beyond the first missing `}`. This is acceptable since templates are authored by maintainers and validated elsewhere (routing registration). ## Consequences - Callers that rely on `extractPathParams` now receive a correctly populated parameter list. - No API changes; only internal behavior is completed. ## Notes - No UI controls were added/changed, so no CSS changes were required. - Localization is unaffected since this change does not introduce user-facing strings.