Files
simple-ini/class.rkt

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)))))
)
)
)