Handle language switching for every route
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
# 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.
|
||||
|
||||
Reference in New Issue
Block a user