aboutsummaryrefslogtreecommitdiff
path: root/src/lustre.gleam
diff options
context:
space:
mode:
Diffstat (limited to 'src/lustre.gleam')
-rw-r--r--src/lustre.gleam97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/lustre.gleam b/src/lustre.gleam
new file mode 100644
index 0000000..4f8249a
--- /dev/null
+++ b/src/lustre.gleam
@@ -0,0 +1,97 @@
+//// To read the full documentation for this module, please visit
+//// [https://pkg.hayleigh.dev/lustre/api/lustre](https://pkg.hayleigh.dev/lustre/api/lustre)
+
+// IMPORTS ---------------------------------------------------------------------
+
+import gleam/dynamic.{Decoder}
+import gleam/map.{Map}
+import lustre/effect.{Effect}
+import lustre/element.{Element}
+
+// TYPES -----------------------------------------------------------------------
+
+///
+pub type App(flags, model, msg)
+
+pub type Error {
+ AppAlreadyStarted
+ AppNotYetStarted
+ BadComponentName
+ ComponentAlreadyRegistered
+ ElementNotFound
+ NotABrowser
+}
+
+// CONSTRUCTORS ----------------------------------------------------------------
+
+@target(javascript)
+///
+pub fn element(element: Element(msg)) -> App(Nil, Nil, msg) {
+ let init = fn(_) { #(Nil, effect.none()) }
+ let update = fn(_, _) { #(Nil, effect.none()) }
+ let view = fn(_) { element }
+
+ application(init, update, view)
+}
+
+@target(javascript)
+///
+pub fn simple(
+ init: fn(flags) -> model,
+ update: fn(model, msg) -> model,
+ view: fn(model) -> Element(msg),
+) -> App(flags, model, msg) {
+ let init = fn(flags) { #(init(flags), effect.none()) }
+ let update = fn(model, msg) { #(update(model, msg), effect.none()) }
+
+ application(init, update, view)
+}
+
+@target(javascript)
+///
+@external(javascript, "./lustre.ffi.mjs", "setup")
+pub fn application(
+ init: fn(flags) -> #(model, Effect(msg)),
+ update: fn(model, msg) -> #(model, Effect(msg)),
+ view: fn(model) -> Element(msg),
+) -> App(flags, model, msg)
+
+@target(javascript)
+@external(javascript, "./lustre.ffi.mjs", "setup_component")
+pub fn component(
+ name: String,
+ init: fn() -> #(model, Effect(msg)),
+ update: fn(model, msg) -> #(model, Effect(msg)),
+ view: fn(model) -> Element(msg),
+ on_attribute_change: Map(String, Decoder(msg)),
+) -> Result(Nil, Error)
+
+// EFFECTS ---------------------------------------------------------------------
+
+@target(javascript)
+///
+@external(javascript, "./lustre.ffi.mjs", "start")
+pub fn start(
+ app: App(flags, model, msg),
+ selector: String,
+ flags: flags,
+) -> Result(fn(msg) -> Nil, Error)
+
+@target(javascript)
+///
+@external(javascript, "./lustre.ffi.mjs", "destroy")
+pub fn destroy(app: App(flags, model, msg)) -> Result(Nil, Error)
+
+// UTILS -----------------------------------------------------------------------
+
+///
+@external(javascript, "./lustre.ffi.mjs", "is_browser")
+pub fn is_browser() -> Bool {
+ False
+}
+
+///
+@external(javascript, "./lustre.ffi.mjs", "is_registered")
+pub fn is_registered(_name: String) -> Bool {
+ False
+}