feat: allow customize derives for serverfn input struct (#2545)
This commit is contained in:
parent
47bcee0ef4
commit
20f4323e50
|
@ -33,6 +33,7 @@ use syn::__private::ToTokens;
|
||||||
/// - `endpoint`: specifies the exact path at which the server function handler will be mounted,
|
/// - `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)
|
/// relative to the prefix (defaults to the function name followed by unique hash)
|
||||||
/// - `input`: the encoding for the arguments (defaults to `PostUrl`)
|
/// - `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`)
|
/// - `output`: the encoding for the response (defaults to `Json`)
|
||||||
/// - `client`: a custom `Client` implementation that will be used for this server fn
|
/// - `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
|
/// - `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,
|
struct_name,
|
||||||
prefix,
|
prefix,
|
||||||
input,
|
input,
|
||||||
|
input_derive,
|
||||||
output,
|
output,
|
||||||
fn_path,
|
fn_path,
|
||||||
builtin_encoding,
|
builtin_encoding,
|
||||||
|
@ -402,12 +403,18 @@ pub fn server_macro_impl(
|
||||||
Clone, #server_fn_path::serde_lite::Serialize, #server_fn_path::serde_lite::Deserialize
|
Clone, #server_fn_path::serde_lite::Serialize, #server_fn_path::serde_lite::Deserialize
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
_ => (
|
_ => match input_derive {
|
||||||
PathInfo::Serde,
|
Some(derives) => {
|
||||||
quote! {
|
let d = derives.elems;
|
||||||
Clone, #server_fn_path::serde::Serialize, #server_fn_path::serde::Deserialize
|
(PathInfo::None, quote! { #d })
|
||||||
},
|
}
|
||||||
),
|
None => (
|
||||||
|
PathInfo::Serde,
|
||||||
|
quote! {
|
||||||
|
Clone, #server_fn_path::serde::Serialize, #server_fn_path::serde::Deserialize
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
let addl_path = match path {
|
let addl_path = match path {
|
||||||
PathInfo::Serde => quote! {
|
PathInfo::Serde => quote! {
|
||||||
|
@ -673,6 +680,7 @@ struct ServerFnArgs {
|
||||||
struct_name: Option<Ident>,
|
struct_name: Option<Ident>,
|
||||||
prefix: Option<Literal>,
|
prefix: Option<Literal>,
|
||||||
input: Option<Type>,
|
input: Option<Type>,
|
||||||
|
input_derive: Option<ExprTuple>,
|
||||||
output: Option<Type>,
|
output: Option<Type>,
|
||||||
fn_path: Option<Literal>,
|
fn_path: Option<Literal>,
|
||||||
req_ty: Option<Type>,
|
req_ty: Option<Type>,
|
||||||
|
@ -693,6 +701,7 @@ impl Parse for ServerFnArgs {
|
||||||
|
|
||||||
// new arguments: can only be keyed by name
|
// new arguments: can only be keyed by name
|
||||||
let mut input: Option<Type> = None;
|
let mut input: Option<Type> = None;
|
||||||
|
let mut input_derive: Option<ExprTuple> = None;
|
||||||
let mut output: Option<Type> = None;
|
let mut output: Option<Type> = None;
|
||||||
let mut req_ty: Option<Type> = None;
|
let mut req_ty: Option<Type> = None;
|
||||||
let mut res_ty: Option<Type> = None;
|
let mut res_ty: Option<Type> = None;
|
||||||
|
@ -760,6 +769,14 @@ impl Parse for ServerFnArgs {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
input = Some(stream.parse()?);
|
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" {
|
} else if key == "output" {
|
||||||
if encoding.is_some() {
|
if encoding.is_some() {
|
||||||
return Err(syn::Error::new(
|
return Err(syn::Error::new(
|
||||||
|
@ -902,6 +919,7 @@ impl Parse for ServerFnArgs {
|
||||||
struct_name,
|
struct_name,
|
||||||
prefix,
|
prefix,
|
||||||
input,
|
input,
|
||||||
|
input_derive,
|
||||||
output,
|
output,
|
||||||
fn_path,
|
fn_path,
|
||||||
builtin_encoding,
|
builtin_encoding,
|
||||||
|
|
Loading…
Reference in New Issue