From 2540b32902471211e23db821307074461186d173 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Wed, 17 Sep 2025 00:17:31 +0200 Subject: [PATCH] feat: WIP --- Cargo.lock | 35 ++++++++++++++++++++ Cargo.toml | 1 + automation_devices/Cargo.toml | 1 + automation_devices/src/lib.rs | 10 ++++++ automation_devices/src/ntfy.rs | 28 ++++++++++++---- config.lua | 6 +++- definitions.bak/automation:devices.lua | 42 ++++++++++++++++++++++++ definitions.bak/automation:secrets.lua | 6 ++++ definitions.bak/automation:utils.lua | 27 +++++++++++++++ definitions.bak/automation:variables.lua | 6 ++++ src/bin/generate_definitions.rs | 3 ++ 11 files changed, 158 insertions(+), 7 deletions(-) create mode 100644 definitions.bak/automation:devices.lua create mode 100644 definitions.bak/automation:secrets.lua create mode 100644 definitions.bak/automation:utils.lua create mode 100644 definitions.bak/automation:variables.lua create mode 100644 src/bin/generate_definitions.rs diff --git a/Cargo.lock b/Cargo.lock index accc16c..f666abe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -128,6 +128,7 @@ dependencies = [ "eui48", "google_home", "inventory", + "lua_typed", "mlua", "reqwest", "rumqttc", @@ -345,6 +346,15 @@ dependencies = [ "winnow", ] +[[package]] +name = "convert_case" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1094,6 +1104,25 @@ dependencies = [ "cc", ] +[[package]] +name = "lua_typed" +version = "0.1.0" +source = "git+https://git.huizinga.dev/Dreaded_X/lua_typed#cef241546e679190472b1ea7e5904cf8102f7f4b" +dependencies = [ + "lua_typed_macro", +] + +[[package]] +name = "lua_typed_macro" +version = "0.1.0" +source = "git+https://git.huizinga.dev/Dreaded_X/lua_typed#cef241546e679190472b1ea7e5904cf8102f7f4b" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "luajit-src" version = "210.6.1+f9140a6" @@ -2256,6 +2285,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "untrusted" version = "0.9.0" diff --git a/Cargo.toml b/Cargo.toml index 952c0c4..5f401f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,7 @@ indexmap = { version = "2.11.0", features = ["serde"] } inventory = "0.3.21" itertools = "0.14.0" json_value_merge = "2.0.1" +lua_typed = { git = "https://git.huizinga.dev/Dreaded_X/lua_typed" } mlua = { version = "0.11.3", features = [ "lua54", "vendored", diff --git a/automation_devices/Cargo.toml b/automation_devices/Cargo.toml index 4bfee79..5aba41f 100644 --- a/automation_devices/Cargo.toml +++ b/automation_devices/Cargo.toml @@ -14,6 +14,7 @@ dyn-clone = { workspace = true } eui48 = { workspace = true } google_home = { workspace = true } inventory = { workspace = true } +lua_typed = { workspace = true } mlua = { workspace = true } reqwest = { workspace = true } rumqttc = { workspace = true } diff --git a/automation_devices/src/lib.rs b/automation_devices/src/lib.rs index 80f3f17..12f8831 100644 --- a/automation_devices/src/lib.rs +++ b/automation_devices/src/lib.rs @@ -14,6 +14,7 @@ mod zigbee; use automation_lib::Module; use automation_lib::device::{Device, LuaDeviceCreate}; +use lua_typed::Typed; use tracing::debug; macro_rules! register_device { @@ -64,3 +65,12 @@ pub fn create_module(lua: &mlua::Lua) -> mlua::Result { } inventory::submit! {Module::new("devices", create_module)} + +pub fn generate_definitions() { + println!("{}", ntfy::Priority::generate_full().unwrap()); + println!("{}", ntfy::ActionType::generate_full().unwrap()); + println!("{}", ntfy::Action::generate_full().unwrap()); + println!("{}", ntfy::Notification::generate_full().unwrap()); + println!("{}", ntfy::Config::generate_full().unwrap()); + println!("{}", ntfy::Ntfy::generate_full().unwrap()); +} diff --git a/automation_devices/src/ntfy.rs b/automation_devices/src/ntfy.rs index 78c7ba8..058ca75 100644 --- a/automation_devices/src/ntfy.rs +++ b/automation_devices/src/ntfy.rs @@ -4,12 +4,13 @@ use std::convert::Infallible; use async_trait::async_trait; use automation_lib::device::{Device, LuaDeviceCreate}; use automation_macro::{Device, LuaDeviceConfig}; +use lua_typed::Typed; use mlua::LuaSerdeExt; use serde::{Deserialize, Serialize}; use serde_repr::*; use tracing::{error, trace, warn}; -#[derive(Debug, Serialize_repr, Deserialize, Clone, Copy)] +#[derive(Debug, Serialize_repr, Deserialize, Clone, Copy, Typed)] #[repr(u8)] #[serde(rename_all = "snake_case")] pub enum Priority { @@ -20,7 +21,7 @@ pub enum Priority { Max, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone, Typed)] #[serde(rename_all = "snake_case", tag = "action")] pub enum ActionType { Broadcast { @@ -31,7 +32,7 @@ pub enum ActionType { // Http } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone, Typed)] pub struct Action { #[serde(flatten)] pub action: ActionType, @@ -39,14 +40,14 @@ pub struct Action { pub clear: Option, } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Typed)] struct NotificationFinal { topic: String, #[serde(flatten)] inner: Notification, } -#[derive(Debug, Serialize, Clone, Deserialize)] +#[derive(Debug, Serialize, Clone, Deserialize, Typed)] pub struct Notification { title: String, message: Option, @@ -67,7 +68,7 @@ impl Notification { } } -#[derive(Debug, Clone, LuaDeviceConfig)] +#[derive(Debug, Clone, LuaDeviceConfig, Typed)] pub struct Config { #[device_config(default("https://ntfy.sh".into()))] pub url: String, @@ -96,6 +97,21 @@ impl Ntfy { } } +impl Typed for Ntfy { + fn type_name() -> String { + "Ntfy".into() + } + + fn generate_header() -> Option { + Some("---@class Ntfy\n".into()) + } + + fn generate_members() -> Option { + Some("---@async\n---@param notification Notification\nfunction Ntfy:send_notification(notification) end".into(), + ) + } +} + #[async_trait] impl LuaDeviceCreate for Ntfy { type Config = Config; diff --git a/config.lua b/config.lua index f3cdc5b..cafbcf7 100644 --- a/config.lua +++ b/config.lua @@ -2,17 +2,21 @@ local devices = require("automation:devices") local device_manager = require("automation:device_manager") local utils = require("automation:utils") local secrets = require("automation:secrets") -local debug = require("automation:variables").debug or false +local debug = require("automation:variables").debug and true or false print(_VERSION) local host = utils.get_hostname() print("Running @" .. host) +--- @param topic string +--- @return string local function mqtt_z2m(topic) return "zigbee2mqtt/" .. topic end +--- @param topic string +--- @return string local function mqtt_automation(topic) return "automation/" .. topic end diff --git a/definitions.bak/automation:devices.lua b/definitions.bak/automation:devices.lua new file mode 100644 index 0000000..d629c6c --- /dev/null +++ b/definitions.bak/automation:devices.lua @@ -0,0 +1,42 @@ +---@meta + +local devices + +---@class Action +---@field action +---| "broadcast" +---| "view" +---@field extras table | nil +---@field label string | nil +---@field clear boolean|nil + +---@alias Priority +---| "min" +---| "low" +---| "default" +---| "high" +---| "max" + +---@class Notification +---@field title string +---@field message string | nil +-- NOTE: It might be possible to specify this down to the actual possible values +---@field tags string[] | nil +---@field priority Priority | nil +---@field actions Action[] | nil + +---@class Ntfy +local Ntfy +---@async +---@param notification Notification +function Ntfy:send_notification(notification) end + +---@class NtfyConfig +---@field topic string + +devices.Ntfy = {} +---@param config NtfyConfig +---@return Ntfy +function devices.Ntfy.new(config) end + +return devices diff --git a/definitions.bak/automation:secrets.lua b/definitions.bak/automation:secrets.lua new file mode 100644 index 0000000..6494943 --- /dev/null +++ b/definitions.bak/automation:secrets.lua @@ -0,0 +1,6 @@ +---@meta + +---@type table +local secrets + +return secrets diff --git a/definitions.bak/automation:utils.lua b/definitions.bak/automation:utils.lua new file mode 100644 index 0000000..d8b380c --- /dev/null +++ b/definitions.bak/automation:utils.lua @@ -0,0 +1,27 @@ +---@meta + +local utils + +---@class Timeout +local Timeout +---@async +---@param timeout number +---@param callback fun() +function Timeout:start(timeout, callback) end +---@async +function Timeout:cancel() end +---@async +---@return boolean +function Timeout:is_waiting() end + +utils.Timeout = {} +---@return Timeout +function utils.Timeout.new() end + +--- @return string hostname +function utils.get_hostname() end + +--- @return number epoch +function utils.get_epoch() end + +return utils diff --git a/definitions.bak/automation:variables.lua b/definitions.bak/automation:variables.lua new file mode 100644 index 0000000..6f09c6d --- /dev/null +++ b/definitions.bak/automation:variables.lua @@ -0,0 +1,6 @@ +---@meta + +---@type table +local variables + +return variables diff --git a/src/bin/generate_definitions.rs b/src/bin/generate_definitions.rs new file mode 100644 index 0000000..eee496d --- /dev/null +++ b/src/bin/generate_definitions.rs @@ -0,0 +1,3 @@ +fn main() { + automation_devices::generate_definitions() +}