aboutsummaryrefslogtreecommitdiff
path: root/src/http_ffi.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/http_ffi.erl')
-rw-r--r--src/http_ffi.erl76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/http_ffi.erl b/src/http_ffi.erl
new file mode 100644
index 0000000..507ee06
--- /dev/null
+++ b/src/http_ffi.erl
@@ -0,0 +1,76 @@
+-module(http_ffi).
+-export([serve/1]).
+
+serve(Port) ->
+ {ok, Pattern} = re:compile("name *= *\"(?<Name>.+)\""),
+ {ok, Toml} = file:read_file("gleam.toml"),
+ {match, [Name]} = re:run(Toml, Pattern, [{capture, all_names, binary}]),
+
+ Html =
+ <<
+ "<!DOCTYPE html>\n"
+ "<html lang=\"en\">\n"
+ "<head>\n"
+ " <meta charset=\"UTF-8\">\n"
+ " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n"
+ " <title>Lustre preview server</title>\n"
+ "\n"
+ " <script type=\"module\">\n"
+ " import { main } from './",
+ Name/binary,
+ "/",
+ Name/binary,
+ ".mjs'\n"
+ "\n"
+ " document.addEventListener(\"DOMContentLoaded\", () => {\n"
+ " main();\n"
+ " });\n"
+ " </script>\n"
+ "</head>\n"
+ "<body>\n"
+ " <div data-lustre-app></div>\n"
+ "</body>\n"
+ "</html>"
+ >>,
+
+ file:write_file("build/dev/javascript/index.html", Html),
+
+ AbsPath =
+ string:trim(
+ filename:absname("build/dev/javascript"), trailing, "/."
+ ),
+
+ inets:start(),
+ Address = {127, 0, 0, 1},
+
+ {ok, Pid} =
+ httpd:start_service([
+ {bind_address, Address},
+ {document_root, AbsPath},
+ {server_root, AbsPath},
+ {directory_index, ["index.html"]},
+ {server_name, "localhost"},
+ {port, Port},
+ {default_type, "text/html"},
+ {mime_types, mime_types()},
+ {modules, [mod_alias, mod_dir, mod_get]}
+ ]),
+
+ receive
+ {From, shutdown} ->
+ ok = httpd:stop_service(Pid),
+ From ! done
+ end.
+
+mime_types() ->
+ [
+ {"html", "text/html"},
+ {"htm", "text/html"},
+ {"js", "text/javascript"},
+ {"mjs", "text/javascript"},
+ {"css", "text/css"},
+ {"gif", "image/gif"},
+ {"jpg", "image/jpeg"},
+ {"jpeg", "image/jpeg"},
+ {"png", "image/png"}
+ ].