mirror of
https://github.com/leptos-rs/leptos
synced 2024-11-10 06:44:17 +00:00
feat: allow customize derives for serverfn input struct (#2545)
This commit is contained in:
parent
47bcee0ef4
commit
20f4323e50
2 changed files with 25 additions and 6 deletions
|
@ -33,6 +33,7 @@ use syn::__private::ToTokens;
|
|||
/// - `endpoint`: specifies the exact path at which the server function handler will be mounted,
|
||||
/// relative to the prefix (defaults to the function name followed by unique hash)
|
||||
/// - `input`: the encoding for the arguments (defaults to `PostUrl`)
|
||||
/// - `input_derive`: a list of derives to be added on the generated input struct (defaults to `(Clone, serde::Serialize, serde::Deserialize)` if `input` is set to a custom struct, won't have an effect otherwise)
|
||||
/// - `output`: the encoding for the response (defaults to `Json`)
|
||||
/// - `client`: a custom `Client` implementation that will be used for this server fn
|
||||
/// - `encoding`: (legacy, may be deprecated in future) specifies the encoding, which may be one
|
||||
|
|
|
@ -112,6 +112,7 @@ pub fn server_macro_impl(
|
|||
struct_name,
|
||||
prefix,
|
||||
input,
|
||||
input_derive,
|
||||
output,
|
||||
fn_path,
|
||||
builtin_encoding,
|
||||
|
@ -402,12 +403,18 @@ pub fn server_macro_impl(
|
|||
Clone, #server_fn_path::serde_lite::Serialize, #server_fn_path::serde_lite::Deserialize
|
||||
},
|
||||
),
|
||||
_ => (
|
||||
PathInfo::Serde,
|
||||
quote! {
|
||||
Clone, #server_fn_path::serde::Serialize, #server_fn_path::serde::Deserialize
|
||||
},
|
||||
),
|
||||
_ => match input_derive {
|
||||
Some(derives) => {
|
||||
let d = derives.elems;
|
||||
(PathInfo::None, quote! { #d })
|
||||
}
|
||||
None => (
|
||||
PathInfo::Serde,
|
||||
quote! {
|
||||
Clone, #server_fn_path::serde::Serialize, #server_fn_path::serde::Deserialize
|
||||
},
|
||||
),
|
||||
},
|
||||
};
|
||||
let addl_path = match path {
|
||||
PathInfo::Serde => quote! {
|
||||
|
@ -673,6 +680,7 @@ struct ServerFnArgs {
|
|||
struct_name: Option<Ident>,
|
||||
prefix: Option<Literal>,
|
||||
input: Option<Type>,
|
||||
input_derive: Option<ExprTuple>,
|
||||
output: Option<Type>,
|
||||
fn_path: Option<Literal>,
|
||||
req_ty: Option<Type>,
|
||||
|
@ -693,6 +701,7 @@ impl Parse for ServerFnArgs {
|
|||
|
||||
// new arguments: can only be keyed by name
|
||||
let mut input: Option<Type> = None;
|
||||
let mut input_derive: Option<ExprTuple> = None;
|
||||
let mut output: Option<Type> = None;
|
||||
let mut req_ty: Option<Type> = None;
|
||||
let mut res_ty: Option<Type> = None;
|
||||
|
@ -760,6 +769,14 @@ impl Parse for ServerFnArgs {
|
|||
));
|
||||
}
|
||||
input = Some(stream.parse()?);
|
||||
} else if key == "input_derive" {
|
||||
if input_derive.is_some() {
|
||||
return Err(syn::Error::new(
|
||||
key.span(),
|
||||
"keyword argument repeated: `input_derive`",
|
||||
));
|
||||
}
|
||||
input_derive = Some(stream.parse()?);
|
||||
} else if key == "output" {
|
||||
if encoding.is_some() {
|
||||
return Err(syn::Error::new(
|
||||
|
@ -902,6 +919,7 @@ impl Parse for ServerFnArgs {
|
|||
struct_name,
|
||||
prefix,
|
||||
input,
|
||||
input_derive,
|
||||
output,
|
||||
fn_path,
|
||||
builtin_encoding,
|
||||
|
|
Loading…
Reference in a new issue