grokking simplicity and refactoring
This commit is contained in:
parent
89a7fe100d
commit
fb4361d938
67 changed files with 6275 additions and 56 deletions
60
packages/lab-tool/utils/config/loader.scm
Normal file
60
packages/lab-tool/utils/config/loader.scm
Normal file
|
@ -0,0 +1,60 @@
|
|||
;; utils/config/loader.scm - Configuration loading (file I/O operations)
|
||||
|
||||
(define-module (utils config loader)
|
||||
#:use-module (ice-9 textual-ports)
|
||||
#:use-module (utils logging)
|
||||
#:use-module (utils json)
|
||||
#:use-module (utils config defaults)
|
||||
#:export (load-config-from-file
|
||||
load-config))
|
||||
|
||||
;; Pure function: Parse configuration from JSON string
|
||||
;; Input: json-string
|
||||
;; Output: parsed configuration alist or #f if invalid
|
||||
(define (parse-config-json json-string)
|
||||
"Pure function to parse configuration from JSON string"
|
||||
(catch #t
|
||||
(lambda () (json-string->scm-safe json-string))
|
||||
(lambda (key . args) #f)))
|
||||
|
||||
;; Pure function: Validate configuration structure
|
||||
;; Input: config alist
|
||||
;; Output: #t if valid, #f otherwise
|
||||
(define (validate-config config)
|
||||
"Pure function to validate configuration structure"
|
||||
(and (list? config)
|
||||
(assoc-ref config 'homelab-root)
|
||||
(assoc-ref config 'machines)))
|
||||
|
||||
;; Impure function: Load configuration from file
|
||||
;; Input: file-path string
|
||||
;; Output: configuration alist or default-config if file doesn't exist/invalid
|
||||
(define (load-config-from-file file-path)
|
||||
"Load configuration from file (with side effects: file I/O, logging)"
|
||||
(if (file-exists? file-path)
|
||||
(catch #t
|
||||
(lambda ()
|
||||
(log-debug "Loading configuration from ~a" file-path)
|
||||
(let* ((json-data (call-with-input-file file-path get-string-all))
|
||||
(parsed-config (parse-config-json json-data)))
|
||||
(if (and parsed-config (validate-config parsed-config))
|
||||
(begin
|
||||
(log-info "Configuration loaded successfully")
|
||||
parsed-config)
|
||||
(begin
|
||||
(log-warn "Invalid configuration file, using defaults")
|
||||
default-config))))
|
||||
(lambda (key . args)
|
||||
(log-warn "Failed to load config file, using defaults: ~a" key)
|
||||
default-config))
|
||||
(begin
|
||||
(log-debug "No config file found at ~a, using defaults" file-path)
|
||||
default-config)))
|
||||
|
||||
;; Impure function: Load configuration with default path
|
||||
(define (load-config . args)
|
||||
"Load configuration with optional file path"
|
||||
(let ((config-file (if (null? args)
|
||||
(string-append (getenv "HOME") "/.config/homelab/config.json")
|
||||
(car args))))
|
||||
(load-config-from-file config-file)))
|
Loading…
Add table
Add a link
Reference in a new issue