~subsetpark/bagatto

ref: c22c5b081d01751c3ed14046b11ffff11cebbfa6 bagatto/main.janet -rw-r--r-- 2.5 KiB
c22c5b08 — Zach Smith Cache path creation 10 months ago
                                                                                
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
(import temple)
(import argparse :prefix "")

(import src/core)
(import src/error)
(import src/writers)
(import src/threads)

(def bagatto
  ```
  An environment populated by the "stdlib" we want to expose to
  template and index module authors.
  ```
  (require "bagatto-require"))

# Monkey-patch the temple environment with our additional functions.
(merge-into temple/base-env bagatto)

(defn- load-file 
  ```
  Given the filename of our index module, evaluate it in the execution
  environment with our "stdlib" in it. This will give index module
  authors access to its additional namespaces without having to import
  them (and, as the environment was created at compile time, without
  those libraries having to be present when the index module is
  written).
  ```
  [index]
  (temple/add-loader)
  (dofile index))

(defn- index-value
  [env sym index]
  (try ((env sym) :value)
       ([err fib] (error/eval-error sym index))))

(def argparse-params ["A transparent, extensible static site generator."
                      "repl" {:kind :flag
                              :help "Compile your index module and enter the REPL."}
                      :default {:kind
                                :option
                                :help "The index module to evaluate."
                                :required true}])

(defn main [& args]
  (merge-into root-env bagatto)
  
  (match (os/getenv "JANET_PATH")
    nil :ok
    janet-path (put root-env :syspath janet-path))

  (let [args (argparse ;argparse-params)
        index (args :default)
        env (load-file index)]
    # Monkey-patch the temple environment with the functions defined
    # in the index module.
    (merge-into temple/base-env env)

    (if (args "repl")
      # REPL mode: Enter a REPL to experiment with the contents of the
      # index module.
      (repl nil nil env)
      # Normal mode: evaluate index module and write site.
      (do
        (setdyn :bagatto-defaults (env :bagatto-defaults))
        (def output-dir (env :bagatto-output-dir))

        (def data (let [data-spec (index-value env 'data index)]
                    (core/load-data data-spec)))
        
        (def writer-specs (let [site-spec (index-value env 'site index)]
                            (core/produce-writer-specs site-spec data)))

        
        (threads/demand-pipeline writer-specs
                                 writers/writer-init
                                 (writers/handle-writes output-dir)
                                 (min threads/default-pool-size (length writer-specs)))))))