Invoke Tauri command from Gleam
This commit is contained in:
parent
17e2d988cb
commit
9ae2a39dd7
8 changed files with 64 additions and 20 deletions
|
@ -13,6 +13,7 @@ target = "javascript"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gleam_stdlib = "~> 0.32"
|
gleam_stdlib = "~> 0.32"
|
||||||
lustre = "~> 3.1"
|
lustre = "~> 3.1"
|
||||||
|
gleam_javascript = "~> 0.7"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
gleeunit = "~> 1.0"
|
gleeunit = "~> 1.0"
|
||||||
|
|
|
@ -5,14 +5,16 @@ packages = [
|
||||||
{ name = "argv", version = "1.0.1", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "A6E9009E50BBE863EB37D963E4315398D41A3D87D0075480FC244125808F964A" },
|
{ name = "argv", version = "1.0.1", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "A6E9009E50BBE863EB37D963E4315398D41A3D87D0075480FC244125808F964A" },
|
||||||
{ name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" },
|
{ name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" },
|
||||||
{ name = "gleam_community_colour", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "A49A5E3AE8B637A5ACBA80ECB9B1AFE89FD3D5351FF6410A42B84F666D40D7D5" },
|
{ name = "gleam_community_colour", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "A49A5E3AE8B637A5ACBA80ECB9B1AFE89FD3D5351FF6410A42B84F666D40D7D5" },
|
||||||
|
{ name = "gleam_javascript", version = "0.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "EEA30D1ABF62B06FC378764D598DF041303CFA33A6586BFF4C4BFEFFA83DBDBE" },
|
||||||
{ name = "gleam_stdlib", version = "0.35.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "5443EEB74708454B65650FEBBB1EF5175057D1DEC62AEA9D7C6D96F41DA79152" },
|
{ name = "gleam_stdlib", version = "0.35.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "5443EEB74708454B65650FEBBB1EF5175057D1DEC62AEA9D7C6D96F41DA79152" },
|
||||||
{ name = "gleeunit", version = "1.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "D364C87AFEB26BDB4FB8A5ABDE67D635DC9FA52D6AB68416044C35B096C6882D" },
|
{ name = "gleeunit", version = "1.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "D364C87AFEB26BDB4FB8A5ABDE67D635DC9FA52D6AB68416044C35B096C6882D" },
|
||||||
{ name = "glint", version = "0.14.0", build_tools = ["gleam"], requirements = ["snag", "gleam_community_ansi", "gleam_stdlib", "gleam_community_colour"], otp_app = "glint", source = "hex", outer_checksum = "21AB16D5A50D4EF34DF935915FDBEE06B2DAEDEE3FCC8584C6E635A866566B38" },
|
{ name = "glint", version = "0.14.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "21AB16D5A50D4EF34DF935915FDBEE06B2DAEDEE3FCC8584C6E635A866566B38" },
|
||||||
{ name = "lustre", version = "3.1.4", build_tools = ["gleam"], requirements = ["argv", "gleam_stdlib", "gleam_community_ansi", "glint"], otp_app = "lustre", source = "hex", outer_checksum = "E651E39189F55473837FB7386C06BAED7276B37B5058302CAC880F89C25CB4E9" },
|
{ name = "lustre", version = "3.1.4", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "argv", "glint", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "E651E39189F55473837FB7386C06BAED7276B37B5058302CAC880F89C25CB4E9" },
|
||||||
{ name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" },
|
{ name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[requirements]
|
[requirements]
|
||||||
|
gleam_javascript = { version = "~> 0.7" }
|
||||||
gleam_stdlib = { version = "~> 0.32" }
|
gleam_stdlib = { version = "~> 0.32" }
|
||||||
gleeunit = { version = "~> 1.0" }
|
gleeunit = { version = "~> 1.0" }
|
||||||
lustre = { version = "~> 3.1" }
|
lustre = { version = "~> 3.1" }
|
||||||
|
|
15
package-lock.json
generated
15
package-lock.json
generated
|
@ -8,6 +8,7 @@
|
||||||
"name": "videopls",
|
"name": "videopls",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@tauri-apps/api": "^2.0.0-beta.0",
|
||||||
"vite-gleam": "^0.4.0"
|
"vite-gleam": "^0.4.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -556,6 +557,20 @@
|
||||||
"win32"
|
"win32"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"node_modules/@tauri-apps/api": {
|
||||||
|
"version": "2.0.0-beta.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.0.0-beta.0.tgz",
|
||||||
|
"integrity": "sha512-WLoh/Vk8cgY7XrJV7Vpb6PssReBZWQCATfYBb1aCRDk+sp0NyPwumx6fZ2ECAKzAcs3OeanluwZcajruIW4CPQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18",
|
||||||
|
"npm": ">= 6.6.0",
|
||||||
|
"yarn": ">= 1.19.1"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/tauri"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/estree": {
|
"node_modules/@types/estree": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
"vite": "^5.1.0"
|
"vite": "^5.1.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@tauri-apps/api": "^2.0.0-beta.0",
|
||||||
"vite-gleam": "^0.4.0"
|
"vite-gleam": "^0.4.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,10 @@
|
||||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
app_lib::run();
|
tauri::Builder::default()
|
||||||
|
.invoke_handler(tauri::generate_handler![greet])
|
||||||
|
.run(tauri::generate_context!())
|
||||||
|
.expect("error while running tauri application");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
|
|
10
src/ffi/commands.js
Normal file
10
src/ffi/commands.js
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
import { invoke } from '@tauri-apps/api/core';
|
||||||
|
import { Ok, Error } from "../../build/dev/javascript/videopls/gleam.mjs"; // FIXME: Is this the right way to do this?
|
||||||
|
|
||||||
|
export async function greet(name) {
|
||||||
|
try {
|
||||||
|
return new Ok(await invoke('greet', { name: name }));
|
||||||
|
} catch (error) {
|
||||||
|
return new Error(error.toString());
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,6 @@
|
||||||
import gleam/int
|
import gleam/int
|
||||||
|
import gleam/javascript/promise.{type Promise}
|
||||||
|
import gleam/io
|
||||||
import lustre
|
import lustre
|
||||||
import lustre/attribute
|
import lustre/attribute
|
||||||
import lustre/element.{type Element}
|
import lustre/element.{type Element}
|
||||||
|
@ -22,33 +24,42 @@ fn init(_) -> Model {
|
||||||
pub type Msg {
|
pub type Msg {
|
||||||
Increment
|
Increment
|
||||||
Decrement
|
Decrement
|
||||||
|
Greet
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(model: Model, msg: Msg) -> Model {
|
fn update(model: Model, msg: Msg) -> Model {
|
||||||
case msg {
|
case msg {
|
||||||
Increment -> model + 1
|
Increment -> model + 1
|
||||||
Decrement -> model - 1
|
Decrement -> model - 1
|
||||||
|
Greet -> {
|
||||||
|
{
|
||||||
|
use greeting <- promise.await(greet("Gleam"))
|
||||||
|
case greeting {
|
||||||
|
Ok(g) -> io.print(g)
|
||||||
|
Error(e) -> io.print("greeting err: " <> e)
|
||||||
|
}
|
||||||
|
promise.resolve(#())
|
||||||
|
}
|
||||||
|
model
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@external(javascript, "./ffi/commands.js", "greet")
|
||||||
|
pub fn greet(name: String) -> Promise(Result(String, String))
|
||||||
|
|
||||||
fn view(model: Model) -> Element(Msg) {
|
fn view(model: Model) -> Element(Msg) {
|
||||||
let count = int.to_string(model)
|
let count = int.to_string(model)
|
||||||
|
|
||||||
html.div(
|
html.div([], [
|
||||||
[],
|
html.h1([], [element.text("Gleam + Vite + Tauri")]),
|
||||||
[
|
html.p([attribute.style([#("text-align", "center")])], [
|
||||||
html.h1([], [element.text("Gleam + Vite + Tauri")]),
|
element.text("Gleam counter " <> count <> " ✨"),
|
||||||
html.p(
|
]),
|
||||||
[attribute.style([#("text-align", "center")])],
|
html.p([attribute.style([#("text-align", "center")])], [
|
||||||
[element.text("Gleam counter " <> count <> " ✨")],
|
html.button([event.on_click(Decrement)], [element.text("-")]),
|
||||||
),
|
html.button([event.on_click(Increment)], [element.text("+")]),
|
||||||
html.p(
|
html.button([event.on_click(Greet)], [element.text("Greet")]),
|
||||||
[attribute.style([#("text-align", "center")])],
|
]),
|
||||||
[
|
])
|
||||||
html.button([event.on_click(Decrement)], [element.text("-")]),
|
|
||||||
html.button([event.on_click(Increment)], [element.text("+")]),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,7 @@ button {
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
border: 1px solid transparent;
|
border: 1px solid transparent;
|
||||||
padding: 0.6em 1.2em;
|
padding: 0.6em 1.2em;
|
||||||
|
margin: 0 0.5em;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
|
|
Loading…
Reference in a new issue