diff --git a/Cargo.lock b/Cargo.lock index 31c71a1..72a9bb8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,7 +7,7 @@ name = "action" version = "0.1.0" dependencies = [ "anyhow", - "cuddle-actions-sdk 0.2.0 (git+ssh://git@git.front.kjuulh.io/kjuulh/cuddle-v2)", + "cuddle-actions-sdk 0.2.0 (git+https://git.front.kjuulh.io/kjuulh/cuddle-v2)", "tokio", ] @@ -277,6 +277,7 @@ version = "0.2.0" dependencies = [ "anyhow", "clap", + "cuddle-actions-sdk-derive", "pretty_assertions", "serde", "serde_json", @@ -285,7 +286,7 @@ dependencies = [ [[package]] name = "cuddle-actions-sdk" version = "0.2.0" -source = "git+ssh://git@git.front.kjuulh.io/kjuulh/cuddle-v2#350a3669b04e3ae37fbb31f842f69e1e8afa1721" +source = "git+https://git.front.kjuulh.io/kjuulh/cuddle-v2#c94f6b72b8b17d1e94e63211155e93a4b28bcc80" dependencies = [ "anyhow", "clap", @@ -293,6 +294,18 @@ dependencies = [ "serde_json", ] +[[package]] +name = "cuddle-actions-sdk-derive" +version = "0.2.0" +dependencies = [ + "anyhow", + "darling", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "cuddle-file" version = "0.2.0" @@ -354,6 +367,41 @@ dependencies = [ "toml", ] +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "diff" version = "0.1.13" @@ -403,6 +451,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "fs_extra" version = "1.3.0" @@ -460,6 +514,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "indexmap" version = "2.6.0" @@ -623,6 +683,15 @@ dependencies = [ "yansi", ] +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.89" diff --git a/Cargo.toml b/Cargo.toml index c8a5591..01d6944 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,8 @@ cuddle-rust-actions = { path = "crates/cuddle-rust-actions" } cuddle-lazy = { path = "crates/cuddle-lazy" } cuddle-actions-api = { path = "crates/cuddle-actions-api" } cuddle-value = { path = "crates/cuddle-value" } +cuddle-actions-sdk = { path = "crates/cuddle-actions-sdk" } +cuddle-actions-sdk-derive = { path = "crates/cuddle-actions-sdk-derive" } anyhow = { version = "1" } tokio = { version = "1", features = ["full"] } diff --git a/crates/cuddle-actions-sdk-derive/Cargo.toml b/crates/cuddle-actions-sdk-derive/Cargo.toml new file mode 100644 index 0000000..5169dde --- /dev/null +++ b/crates/cuddle-actions-sdk-derive/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "cuddle-actions-sdk-derive" +edition = "2021" +version.workspace = true + +[lib] +proc-macro = true + +[dependencies] +anyhow.workspace = true +darling = "0.20.10" + +proc-macro-crate = "3.2.0" +proc-macro2 = "1.0.89" +quote = "1.0.37" +syn = { version = "2.0.85", features = ["extra-traits", "visit", "visit-mut"] } diff --git a/crates/cuddle-actions-sdk-derive/src/lib.rs b/crates/cuddle-actions-sdk-derive/src/lib.rs new file mode 100644 index 0000000..5118123 --- /dev/null +++ b/crates/cuddle-actions-sdk-derive/src/lib.rs @@ -0,0 +1,58 @@ +use darling::FromMeta; +use proc_macro::TokenStream; +use syn::{parse_macro_input, ItemImpl}; + +extern crate proc_macro; + +mod args { + use darling::FromMeta; + + #[derive(FromMeta, Default)] + #[darling(default)] + pub struct Object {} +} +mod actions { + use proc_macro::TokenStream; + use syn::ItemImpl; + + use crate::{args, utils::GeneratorResult}; + + pub fn generate( + object_args: &args::Object, + item_impl: &mut ItemImpl, + ) -> GeneratorResult { + todo!() + } +} +mod utils { + pub type GeneratorResult = std::result::Result; +} + +macro_rules! parse_nested_meta { + ($ty:ty, $args:expr) => {{ + let meta = match darling::ast::NestedMeta::parse_meta_list(proc_macro2::TokenStream::from( + $args, + )) { + Ok(v) => v, + Err(e) => { + return TokenStream::from(darling::Error::from(e).write_errors()); + } + }; + + match <$ty>::from_list(&meta) { + Ok(object_args) => object_args, + Err(err) => return TokenStream::from(err.write_errors()), + } + }}; +} + +#[proc_macro_attribute] +#[allow(non_snake_case)] +pub fn Actions(args: TokenStream, input: TokenStream) -> TokenStream { + let object_args = parse_nested_meta!(args::Object, args); + let mut item_impl = parse_macro_input!(input as ItemImpl); + match actions::generate(&object_args, &mut item_impl) { + Ok(expanded) => expanded, + Err(err) => err.to_compile_error().into(), + } +} diff --git a/crates/cuddle-actions-sdk/Cargo.toml b/crates/cuddle-actions-sdk/Cargo.toml index 72096d8..9dc8719 100644 --- a/crates/cuddle-actions-sdk/Cargo.toml +++ b/crates/cuddle-actions-sdk/Cargo.toml @@ -4,6 +4,8 @@ edition = "2021" version.workspace = true [dependencies] +cuddle-actions-sdk-derive.workspace = true + anyhow.workspace = true clap = { workspace = true, features = ["string"] } serde.workspace = true diff --git a/crates/cuddle-actions-sdk/src/lib.rs b/crates/cuddle-actions-sdk/src/lib.rs index 106dbb7..7f414cd 100644 --- a/crates/cuddle-actions-sdk/src/lib.rs +++ b/crates/cuddle-actions-sdk/src/lib.rs @@ -4,6 +4,8 @@ use std::{collections::BTreeMap, ffi::OsString, io::Write}; use serde::Serialize; +pub use cuddle_actions_sdk_derive::Actions; + // Fix design make it so that it works like axum! type ActionFn = dyn Fn() -> anyhow::Result<()> + 'static; diff --git a/crates/cuddle/examples/actions/project/actions/rust/Cargo.toml b/crates/cuddle/examples/actions/project/actions/rust/Cargo.toml index 32f337e..206d0fe 100644 --- a/crates/cuddle/examples/actions/project/actions/rust/Cargo.toml +++ b/crates/cuddle/examples/actions/project/actions/rust/Cargo.toml @@ -5,5 +5,5 @@ edition = "2021" [dependencies] anyhow = "1.0.91" -cuddle-actions-sdk = { git = "ssh://git@git.front.kjuulh.io/kjuulh/cuddle-v2", version = "0.2.0" } +cuddle-actions-sdk = { git = "https://git.front.kjuulh.io/kjuulh/cuddle-v2", version = "0.2.0" } tokio = { version = "1.41.0", features = ["full"] } diff --git a/crates/cuddle/examples/actions/project/actions/rust/src/main.rs b/crates/cuddle/examples/actions/project/actions/rust/src/main.rs index 651d8ee..b1bd2b2 100644 --- a/crates/cuddle/examples/actions/project/actions/rust/src/main.rs +++ b/crates/cuddle/examples/actions/project/actions/rust/src/main.rs @@ -1,5 +1,14 @@ use cuddle_actions_sdk::AddActionOptions; +struct Registry; + +#[Actions] +impl Registry { + pub async fn something() -> anyhow::Result<()> { + Ok(()) + } +} + #[tokio::main] async fn main() -> anyhow::Result<()> { cuddle_actions_sdk::CuddleActions::default() diff --git a/crates/cuddle/src/actions.rs b/crates/cuddle/src/actions.rs deleted file mode 100644 index 8b13789..0000000 --- a/crates/cuddle/src/actions.rs +++ /dev/null @@ -1 +0,0 @@ -