flan/test/programs/web-files.flan

36 lines
1.6 KiB
Plaintext

;;;; The same source on both targets, which is the whole of decision 2.
;;;;
;;;; Flan has NO conditional compilation — nothing in parse.ml or check.ml
;;;; reads the target — so "isolate this to desktop" is not expressible here,
;;;; and a build-time refusal would therefore be unusable. A silent no-op is
;;;; worse than either, because that is how a save file disappears with nothing
;;;; said. So `barf` on the web signals a condition and the program decides,
;;;; which is the language having something Odin does not: Odin stubs its whole
;;;; file API on js/wasm to .Unsupported so that importing core:os "panics
;;;; cleanly", and a panic is not a decision.
;;;;
;;;; Built for the desktop this prints that the write worked. Built for the
;;;; browser it prints that it was refused, and says which file and why. One
;;;; source, two outcomes, no flag anywhere.
(defn main [] i32
;; Embedding needs no filesystem and no host ABI, so this line is identical
;; on both targets and is why decision 1 came first.
(print (embed "assets/a.txt" str))
(handler-bind
[(FileError [c]
(print "refused: ")
(print (.path c))
(print " reason ")
(println (.reason c))
(println (= (.reason c) file-unsupported))
;; There is no restart that means "give up and carry on" — spec-
;; conditions.md §2 makes `error` diverging, and a handler that returns
;; normally has not answered it. Leaving is the honest way out of a
;; save that cannot happen.
(exit 0))]
(barf "web-files-out.txt" (bytes-view "state\n")))
(println "wrote it")
0)