92 lines
2.1 KiB
Racket
92 lines
2.1 KiB
Racket
#lang racket/base
|
|
|
|
(require racket/class)
|
|
(require "main.rkt")
|
|
|
|
(provide ini%
|
|
(all-from-out racket/class))
|
|
|
|
(define-syntax i-set!
|
|
(syntax-rules ()
|
|
((_ a b)
|
|
(set! a b))))
|
|
|
|
|
|
|
|
(define ini%
|
|
(class object%
|
|
(init-field [file #f] [fail #f])
|
|
|
|
(define content #f)
|
|
|
|
(define/public (get-file)
|
|
file)
|
|
|
|
(define/public (set-file! f)
|
|
(i-set! file (get-ini-file f))
|
|
this)
|
|
|
|
(define/public (set-fail! f)
|
|
(i-set! fail f)
|
|
this)
|
|
|
|
(define/public (get-fail)
|
|
fail)
|
|
|
|
(define/public (get-contents)
|
|
content)
|
|
|
|
(define/public (contents)
|
|
content)
|
|
|
|
(define/public (reload)
|
|
(i-set! content (if (eq? file #f)
|
|
(make-ini)
|
|
(if (file-exists? file)
|
|
(file->ini file)
|
|
(make-ini))))
|
|
this)
|
|
|
|
(define/public (set! section key value)
|
|
(begin
|
|
(ini-set! content section key value)
|
|
(if (eq? file #f)
|
|
(when fail
|
|
(error "ini: No filename set, cannot write ini after set!"))
|
|
(ini->file content file))
|
|
this))
|
|
|
|
(define/public (get section key . default-value)
|
|
(let* ((rnd (string->symbol (format "@@no-value-~a-@@" (random 400000000))))
|
|
(def-val (if (null? default-value) rnd (car (default-value)))))
|
|
(let ((r (ini-get content section key def-val)))
|
|
(when fail
|
|
(when (eq? r rnd)
|
|
(error (string-append
|
|
"ini: No default value set and no value found for section '"
|
|
(symbol->string section)
|
|
"' and key '"
|
|
(symbol->string key)
|
|
"'"))
|
|
)
|
|
)
|
|
(if (eq? r rnd)
|
|
#f
|
|
r))))
|
|
|
|
(super-new)
|
|
|
|
(begin
|
|
(if (eq? file #f)
|
|
(i-set! content (make-ini))
|
|
(begin
|
|
(i-set! file (get-ini-file file))
|
|
(if (file-exists? file)
|
|
(i-set! content (file->ini file))
|
|
(i-set! content (make-ini)))))
|
|
)
|
|
|
|
)
|
|
)
|
|
|
|
|