1
0
mirror of https://github.com/janet-lang/janet synced 2024-06-16 10:19:55 +00:00

Add urlloader example.

Demonstrate loading files from URL.
This commit is contained in:
Calvin Rose 2019-05-25 17:10:25 -04:00
parent 0280deccae
commit 840610facf
3 changed files with 46 additions and 9 deletions

View File

@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
## 1.0.0 - ?? ## 1.0.0 - ??
- Add optional filters to `module/paths` to further refine import methods.
- Add keyword arguments via `&keys` in parameter list. - Add keyword arguments via `&keys` in parameter list.
- Add `-k` flag for flychecking source. - Add `-k` flag for flychecking source.
- Change signature to `compile` function. - Change signature to `compile` function.

28
examples/urlloader.janet Normal file
View File

@ -0,0 +1,28 @@
# An example of using Janet's extensible module system
# to import files from URL. To try this, run `janet -l examples/urlloader.janet`
# from the repl, and then:
#
# (import https://raw.githubusercontent.com/janet-lang/janet/master/examples/colors.janet :as c)
#
# This will import a file using curl. You can then try
#
# (print (c/color :green "Hello!"))
#
# This is a bit of a toy example (it just shells out to curl), but it is very
# powerful and will work well in many cases.
(defn- load-url
[url args]
(def f (file/popen (string "curl " url)))
(def res (dofile f :source url ;args))
(try (file/close f) ([err] nil))
res)
(defn- check-http-url
[path]
(or (string/has-prefix? "http://" path)
(string/has-prefix? "https://" path)))
# Add the module loader and path tuple to right places
(array/push module/paths ["HTTP" :janet-http check-http-url identity])
(put module/loaders :janet-http load-url)

View File

@ -1638,7 +1638,7 @@
(defn- mod-filter (defn- mod-filter
[x path] [x path]
(case (type x) (case (type x)
:nil true :nil path
:string (string/has-suffix? x path) :string (string/has-suffix? x path)
(x path))) (x path)))
@ -1651,12 +1651,17 @@
(def parts (string/split "/" path)) (def parts (string/split "/" path))
(def name (last parts)) (def name (last parts))
(var ret nil) (var ret nil)
(each [p mod-kind checker] module/paths (each [p mod-kind checker resolver] module/paths
(when (mod-filter checker path) (when (mod-filter checker path)
(def fullpath (expand-path-name p name path)) (if resolver
(when (fexists fullpath) (when-let [res (resolver path)]
(set ret [fullpath mod-kind]) (set ret [res mod-kind])
(break)))) (break))
(do
(def fullpath (expand-path-name p name path))
(when (fexists fullpath)
(set ret [fullpath mod-kind])
(break))))))
(if ret ret (if ret ret
(let [expander (fn [[t _ chk]] (let [expander (fn [[t _ chk]]
(when (mod-filter chk path) (when (mod-filter chk path)
@ -1683,8 +1688,11 @@
"Evaluate a file in a new environment and return the new environment." "Evaluate a file in a new environment and return the new environment."
[path & args] [path & args]
(def {:exit exit-on-error (def {:exit exit-on-error
:source source
:compile-only compile-only} (table ;args)) :compile-only compile-only} (table ;args))
(def f (file/open path)) (def f (if (= (type path) :core/file)
path
(file/open path)))
(def newenv (make-env)) (def newenv (make-env))
(defn chunks [buf _] (file/read f 2048 buf)) (defn chunks [buf _] (file/read f 2048 buf))
(defn bp [&opt x y] (defn bp [&opt x y]
@ -1704,8 +1712,8 @@
(debug/stacktrace f x) (debug/stacktrace f x)
(if exit-on-error (os/exit 1)))) (if exit-on-error (os/exit 1))))
:compile-only compile-only :compile-only compile-only
:source path}) :source (or source (if (= f path) "<anonymous>" path))})
(file/close f) (when (not= f path) (file/close f))
(table/setproto newenv nil)) (table/setproto newenv nil))
(def module/loaders (def module/loaders