Browse Source

chore: reintroduce option to access window APIs on command fn (#1427)

Lucas Fernandes Nogueira 4 years ago
parent
commit
6a367020a2

+ 2 - 2
cli/core/Cargo.lock

@@ -50,9 +50,9 @@ checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e"
 
 [[package]]
 name = "attohttpc"
-version = "0.16.3"
+version = "0.17.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdb8867f378f33f78a811a8eb9bf108ad99430d7aad43315dd9319c827ef6247"
+checksum = "9a8bda305457262b339322106c776e3fd21df860018e566eb6a5b1aa4b6ae02d"
 dependencies = [
  "flate2",
  "http",

+ 6 - 2
examples/api/src-tauri/src/cmd.rs

@@ -7,8 +7,12 @@ pub struct RequestBody {
   name: String,
 }
 
-#[command]
-pub fn log_operation(event: String, payload: Option<String>) {
+#[command(with_window)]
+pub fn log_operation<M: tauri::Params>(
+  _window: tauri::Window<M>,
+  event: String,
+  payload: Option<String>,
+) {
   println!("{} {:?}", event, payload);
 }
 

+ 30 - 5
tauri-macros/src/command.rs

@@ -1,10 +1,23 @@
 use proc_macro2::TokenStream;
 use quote::{format_ident, quote};
 use syn::{
-  parse::Parser, punctuated::Punctuated, FnArg, Ident, ItemFn, Pat, Path, ReturnType, Token, Type,
+  parse::Parser, punctuated::Punctuated, FnArg, Ident, ItemFn, Meta, NestedMeta, Pat, Path,
+  ReturnType, Token, Type,
 };
 
-pub fn generate_command(function: ItemFn) -> TokenStream {
+pub fn generate_command(attrs: Vec<NestedMeta>, function: ItemFn) -> TokenStream {
+  // Check if "with_window" attr was passed to macro
+  let with_window = attrs.iter().any(|a| {
+    if let NestedMeta::Meta(Meta::Path(path)) = a {
+      path
+        .get_ident()
+        .map(|i| *i == "with_window")
+        .unwrap_or(false)
+    } else {
+      false
+    }
+  });
+
   let fn_name = function.sig.ident.clone();
   let fn_name_str = fn_name.to_string();
   let fn_wrapper = format_ident!("{}_wrapper", fn_name);
@@ -24,7 +37,7 @@ pub fn generate_command(function: ItemFn) -> TokenStream {
   };
 
   // Split function args into names and types
-  let (names, types): (Vec<Ident>, Vec<Path>) = function
+  let (mut names, mut types): (Vec<Ident>, Vec<Path>) = function
     .sig
     .inputs
     .iter()
@@ -46,6 +59,17 @@ pub fn generate_command(function: ItemFn) -> TokenStream {
     })
     .unzip();
 
+  let window_arg_maybe = match types.first() {
+    Some(_) if with_window => {
+      // Remove window arg from list so it isn't expected as arg from JS
+      types.drain(0..1);
+      names.drain(0..1);
+      // Tell wrapper to pass `window` to original function
+      quote!(_window,)
+    }
+    // Tell wrapper not to pass `window` to original function
+    _ => quote!(),
+  };
   let await_maybe = if function.sig.asyncness.is_some() {
     quote!(.await)
   } else {
@@ -58,13 +82,13 @@ pub fn generate_command(function: ItemFn) -> TokenStream {
   // note that all types must implement `serde::Serialize`.
   let return_value = if returns_result {
     quote! {
-      match #fn_name(#(parsed_args.#names),*)#await_maybe {
+      match #fn_name(#window_arg_maybe #(parsed_args.#names),*)#await_maybe {
         Ok(value) => ::core::result::Result::Ok(value),
         Err(e) => ::core::result::Result::Err(e),
       }
     }
   } else {
-    quote! { ::core::result::Result::<_, ()>::Ok(#fn_name(#(parsed_args.#names),*)#await_maybe) }
+    quote! { ::core::result::Result::<_, ()>::Ok(#fn_name(#window_arg_maybe #(parsed_args.#names),*)#await_maybe) }
   };
 
   quote! {
@@ -75,6 +99,7 @@ pub fn generate_command(function: ItemFn) -> TokenStream {
       struct ParsedArgs {
         #(#names: #types),*
       }
+      let _window = message.window();
       match ::serde_json::from_value::<ParsedArgs>(message.payload()) {
         Ok(parsed_args) => message.respond_async(async move {
           #return_value

+ 4 - 3
tauri-macros/src/lib.rs

@@ -1,7 +1,7 @@
 extern crate proc_macro;
 use crate::context::ContextItems;
 use proc_macro::TokenStream;
-use syn::{parse_macro_input, ItemFn};
+use syn::{parse_macro_input, AttributeArgs, ItemFn};
 
 mod command;
 
@@ -9,9 +9,10 @@ mod command;
 mod context;
 
 #[proc_macro_attribute]
-pub fn command(_: TokenStream, item: TokenStream) -> TokenStream {
+pub fn command(attrs: TokenStream, item: TokenStream) -> TokenStream {
   let function = parse_macro_input!(item as ItemFn);
-  let gen = command::generate_command(function);
+  let attrs = parse_macro_input!(attrs as AttributeArgs);
+  let gen = command::generate_command(attrs, function);
   gen.into()
 }
 

+ 1 - 0
tauri/src/lib.rs

@@ -37,6 +37,7 @@ pub use {
   hooks::InvokeMessage,
   runtime::app::AppBuilder,
   runtime::webview::Attributes,
+  runtime::window::Window,
   runtime::{Context, Manager, Params},
 };