#lang s-exp "../lang/kernel.rkt"
(require (for-syntax racket/base
racket/path
racket/port
syntax/parse
"coerse-content-bytes.rkt"
"munge-path.rkt"
"record.rkt"))
(provide define-resource)
(require "structs.rkt")
(require "specialize/impl.rkt")
(define-syntax (define-resource stx)
(syntax-parse stx
[(_ name:id)
(with-syntax ([path (symbol->string (syntax-e #'name))])
(syntax/loc stx
(define-resource name path)))]
[(_ name:id path:str)
(let* ([normal-path
(normalize-path (build-path
(or (current-load-relative-directory)
(current-directory))
(syntax-e #'path)))]
[munged-path (munge-path normal-path)]
[content (coerse-content-bytes normal-path
(call-with-input-file normal-path port->bytes))])
(with-syntax ([normal-path normal-path]
[munged-path munged-path]
[content content])
(syntax/loc stx
(begin
(begin-for-syntax
(let* ([this-module
(variable-reference->resolved-module-path
(#%variable-reference))]
[resolved-module-path (resolved-module-path-name this-module)])
(record-resource resolved-module-path normal-path munged-path)))
(define name (specialize!
(resource normal-path munged-path content)))))))]))