aboutsummaryrefslogtreecommitdiff
path: root/wttrin.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-04-26 18:32:02 -0500
committerCraig Jennings <c@cjennings.net>2026-04-26 18:32:02 -0500
commit38a6a0a745022ed7f0336f7deb121d75f589a916 (patch)
treeb85a9dc15045e5de9fc3f7fae00f8a571de9c6a2 /wttrin.el
parenteabd510c302b43b0b40ee7b92bf5830d345d058d (diff)
downloademacs-wttrin-38a6a0a745022ed7f0336f7deb121d75f589a916.tar.gz
emacs-wttrin-38a6a0a745022ed7f0336f7deb121d75f589a916.zip
refactor: extract wttrin--mode-line-extract-emoji helper
The regex that pulls the emoji character out of a wttr.in mode-line response was inlined inside `wttrin--mode-line-update-display`, mixed in with the render logic. Six tests of the parser couldn't be written without invoking the whole render path. The new pure helper takes the weather string, runs the regex, and returns either the first non-whitespace character after the colon or "?" as a placeholder. The format-explanation comment that used to sit above the inline code is gone now that the same explanation lives in the helper's docstring. There's no risk of comment and code drifting apart. Six tests cover Normal (typical response, different emoji), Boundary (no whitespace after colon, multiple whitespace chars), and Error (no colon, empty string).
Diffstat (limited to 'wttrin.el')
-rw-r--r--wttrin.el14
1 files changed, 10 insertions, 4 deletions
diff --git a/wttrin.el b/wttrin.el
index eb66868..b117bf3 100644
--- a/wttrin.el
+++ b/wttrin.el
@@ -676,6 +676,15 @@ On failure with no cache, shows error placeholder."
;; No cache at all — show error placeholder
(wttrin--mode-line-update-placeholder-error))))))))
+(defun wttrin--mode-line-extract-emoji (weather-string)
+ "Extract the emoji character from WEATHER-STRING.
+The expected format is \"Location: emoji temp conditions\". Returns
+the first non-whitespace character after the colon, or \"?\" when
+WEATHER-STRING contains no colon."
+ (if (string-match ":\\s-*\\(.\\)" weather-string)
+ (match-string 1 weather-string)
+ "?"))
+
(defun wttrin--mode-line-stale-p (cache-entry)
"Return non-nil if CACHE-ENTRY is stale.
Stale means age greater than 2 × `wttrin-mode-line-refresh-interval'.
@@ -715,10 +724,7 @@ shows staleness info in tooltip."
(let* ((weather-string (cdr wttrin--mode-line-cache))
(stale-p (wttrin--mode-line-stale-p wttrin--mode-line-cache)))
(wttrin--debug-log "mode-line-display: Updating from cache, stale=%s" stale-p)
- ;; Response format is "Location: ☀️ +72°F Clear" — grab first char after colon
- (let ((emoji (if (string-match ":\\s-*\\(.\\)" weather-string)
- (match-string 1 weather-string)
- "?")))
+ (let ((emoji (wttrin--mode-line-extract-emoji weather-string)))
(wttrin--debug-log "mode-line-display: Extracted emoji = %S, stale = %s"
emoji stale-p)
(setq wttrin--mode-line-rendered-stale stale-p)