mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 07:33: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 - ?? | ||||
|  | ||||
| - Add optional filters to `module/paths` to further refine import methods. | ||||
| - Add keyword arguments via `&keys` in parameter list. | ||||
| - Add `-k` flag for flychecking source. | ||||
| - 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 | ||||
|   [x path] | ||||
|   (case (type x) | ||||
|     :nil true | ||||
|     :nil path | ||||
|     :string (string/has-suffix? x path) | ||||
|     (x path))) | ||||
|  | ||||
| @@ -1651,12 +1651,17 @@ | ||||
|   (def parts (string/split "/" path)) | ||||
|   (def name (last parts)) | ||||
|   (var ret nil) | ||||
|   (each [p mod-kind checker] module/paths | ||||
|   (each [p mod-kind checker resolver] module/paths | ||||
|     (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)) | ||||
|           (when (fexists fullpath) | ||||
|             (set ret [fullpath mod-kind]) | ||||
|         (break)))) | ||||
|             (break)))))) | ||||
|   (if ret ret | ||||
|     (let [expander (fn [[t _ chk]] | ||||
|                      (when (mod-filter chk path) | ||||
| @@ -1683,8 +1688,11 @@ | ||||
|   "Evaluate a file in a new environment and return the new environment." | ||||
|   [path & args] | ||||
|   (def {:exit exit-on-error | ||||
|         :source source | ||||
|         :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)) | ||||
|   (defn chunks [buf _] (file/read f 2048 buf)) | ||||
|   (defn bp [&opt x y] | ||||
| @@ -1704,8 +1712,8 @@ | ||||
|                                (debug/stacktrace f x) | ||||
|                                (if exit-on-error (os/exit 1)))) | ||||
|                 :compile-only compile-only | ||||
|                 :source path}) | ||||
|   (file/close f) | ||||
|                 :source (or source (if (= f path) "<anonymous>" path))}) | ||||
|   (when (not= f path) (file/close f)) | ||||
|   (table/setproto newenv nil)) | ||||
|  | ||||
| (def module/loaders | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose