//// 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) @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 }