mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 15:43:01 +00:00 
			
		
		
		
	Add urlloader example.
Demonstrate loading files from URL.
This commit is contained in:
		| @@ -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
									
								
							
							
						
						
									
										28
									
								
								examples/urlloader.janet
									
									
									
									
									
										Normal 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) | ||||||
| @@ -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) | ||||||
|  |       (if resolver | ||||||
|  |         (when-let [res (resolver path)] | ||||||
|  |                   (set ret [res mod-kind]) | ||||||
|  |                   (break)) | ||||||
|  |         (do | ||||||
|           (def fullpath (expand-path-name p name path)) |           (def fullpath (expand-path-name p name path)) | ||||||
|           (when (fexists fullpath) |           (when (fexists fullpath) | ||||||
|             (set ret [fullpath mod-kind]) |             (set ret [fullpath mod-kind]) | ||||||
|         (break)))) |             (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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose