summaryrefslogtreecommitdiff
path: root/wttrin-debug.el
blob: 55546d4ef593e1df7dc11eb31bf99a9538522623 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
;;; wttrin-debug.el --- Debug functions for wttrin.el -*- lexical-binding: t; -*-

;; Copyright (C) 2025 Craig Jennings
;; Author: Craig Jennings <c@cjennings.net>
;; Keywords: debug weather wttrin

;; SPDX-License-Identifier: GPL-3.0-or-later

;;; Commentary:

;; This file contains debug functions for troubleshooting wttrin.el behavior.
;; It is only loaded when `wttrin-debug' is non-nil.
;;
;; Enable with:
;;   (setq wttrin-debug t)
;;   (require 'wttrin)
;;
;; Available debug functions:
;; - `debug-wttrin-show-raw' - View raw weather data with line numbers
;; - `debug-wttrin-mode-line' - Diagnose mode-line lighter issues
;; - `wttrin--debug-mode-line-info' - Auto-called when wttrin runs (if debug enabled)
;;
;; Interactive commands:
;; - M-x debug-wttrin-enable  - Enable debug mode
;; - M-x debug-wttrin-disable - Disable debug mode
;;
;; When debug mode is enabled, raw weather data is automatically saved to
;; timestamped files in `temporary-file-directory' for bug reports.

;;; Code:

;; wttrin-debug.el is loaded by wttrin.el, so wttrin is already loaded
;; No need for (require 'wttrin) here

;;;###autoload
(defun debug-wttrin-show-raw (location)
  "Fetch and display raw wttr.in data for LOCATION with line numbers.
This is useful for debugging header parsing issues."
  (interactive "sLocation: ")
  (let ((raw-string (wttrin--get-cached-or-fetch location)))
    (with-current-buffer (get-buffer-create "*wttrin-debug*")
      (erase-buffer)
      (insert raw-string)
      (goto-char (point-min))
      (let ((line-num 1))
        (while (not (eobp))
          (beginning-of-line)
          (insert (format "%2d: " line-num))
          (setq line-num (1+ line-num))
          (forward-line 1)))
      (goto-char (point-min))
      (switch-to-buffer (current-buffer)))))

;;;###autoload
(defun debug-wttrin-enable ()
  "Enable wttrin debug mode.
Raw weather data will be saved to timestamped files for bug reports."
  (interactive)
  (setq wttrin-debug t)
  (message "Wttrin debug mode enabled. Raw data will be saved to: %s" temporary-file-directory))

;;;###autoload
(defun debug-wttrin-disable ()
  "Disable wttrin debug mode."
  (interactive)
  (setq wttrin-debug nil)
  (message "Wttrin debug mode disabled"))

;;;###autoload
(defun debug-wttrin-mode-line ()
  "Display detailed mode-line information for the wttrin buffer.
This is useful for diagnosing why the mode-line lighter isn't appearing."
  (interactive)
  (if-let ((buf (get-buffer "*wttr.in*")))
      (with-current-buffer buf
        (let* ((has-custom-modeline (boundp 'cj/modeline-major-mode))
               (formatted-mode (when has-custom-modeline
                                 (format-mode-line mode-name))))
          (with-output-to-temp-buffer "*wttrin-mode-debug*"
            (princ (format "=== Wttrin Mode-Line Debug Info ===\n\n"))
            (princ (format "Buffer: %s\n" (buffer-name)))
            (princ (format "Major mode: %s\n" major-mode))
            (princ (format "mode-name variable: %S\n" mode-name))
            (princ (format "mode-name type: %s\n" (type-of mode-name)))
            (princ (format "\nCustom modeline detected: %s\n" has-custom-modeline))
            (when has-custom-modeline
              (princ (format "format-mode-line result: %S\n" formatted-mode)))
            (princ (format "\nmode-line-format first 5 elements:\n"))
            (let ((i 0))
              (dolist (elem mode-line-format)
                (when (< i 5)
                  (princ (format "  [%d] %S\n" i elem))
                  (setq i (1+ i)))))
            (princ (format "\nSpecial-mode parent: %s\n"
                          (get 'wttrin-mode 'derived-mode-parent)))
            (princ (format "Is special-mode active: %s\n"
                          (derived-mode-p 'special-mode))))))
    (message "No *wttr.in* buffer exists. Run M-x wttrin first.")))

(defun wttrin--debug-mode-line-info ()
  "Auto-generate mode-line diagnostic information.
This function is called automatically when wttrin runs if debug mode is enabled.
It creates the *wttrin-mode-debug* buffer with diagnostic information."
  (debug-wttrin-mode-line))

(provide 'wttrin-debug)
;;; wttrin-debug.el ends here