Skip to content

Commit 148d9ce

Browse files
committed
signature_derive: adds support for lifetimes
1 parent f1ae691 commit 148d9ce

File tree

1 file changed

+76
-6
lines changed

1 file changed

+76
-6
lines changed

signature_derive/src/lib.rs

Lines changed: 76 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use proc_macro::TokenStream;
1414
use proc_macro2::{Span, TokenStream as TokenStream2};
1515
use quote::quote;
1616
use syn::{
17-
parse_macro_input, parse_quote, punctuated::Punctuated, DeriveInput, Ident, PredicateType,
18-
Token, TraitBound, Type, TypeParam, TypeParamBound, WhereClause, WherePredicate,
17+
parse_macro_input, parse_quote, punctuated::Punctuated, DeriveInput, Ident, Lifetime,
18+
PredicateType, Token, TraitBound, Type, TypeParam, TypeParamBound, WhereClause, WherePredicate,
1919
};
2020

2121
/// Derive the [`Signer`] trait for a type which impls [`DigestSigner`].
@@ -51,12 +51,19 @@ fn emit_signer_impl(input: DeriveInput) -> TokenStream2 {
5151
);
5252

5353
let name = params.name;
54+
let lifetimes = params.lifetimes;
5455
let impl_generics = params.impl_generics;
5556
let ty_generics = params.ty_generics;
5657
let where_clause = params.where_clause;
5758

59+
let sep = if lifetimes.is_empty() {
60+
quote! {}
61+
} else {
62+
quote! {,}
63+
};
64+
5865
quote! {
59-
impl<#(#impl_generics),*> ::signature::Signer<#s_ident> for #name<#(#ty_generics),*>
66+
impl<#(#lifetimes),* #sep #(#impl_generics),*> ::signature::Signer<#s_ident> for #name<#(#lifetimes),* #sep #(#ty_generics),*>
6067
#where_clause
6168
{
6269
fn try_sign(&self, msg: &[u8]) -> ::signature::Result<#s_ident> {
@@ -99,12 +106,19 @@ fn emit_verifier_impl(input: DeriveInput) -> TokenStream2 {
99106
);
100107

101108
let name = params.name;
109+
let lifetimes = params.lifetimes;
102110
let impl_generics = params.impl_generics;
103111
let ty_generics = params.ty_generics;
104112
let where_clause = params.where_clause;
105113

114+
let sep = if lifetimes.is_empty() {
115+
quote! {}
116+
} else {
117+
quote! {,}
118+
};
119+
106120
quote! {
107-
impl<#(#impl_generics),*> ::signature::Verifier<#s_ident> for #name<#(#ty_generics),*>
121+
impl<#(#lifetimes),* #sep #(#impl_generics),*> ::signature::Verifier<#s_ident> for #name<#(#lifetimes),* #sep #(#ty_generics),*>
108122
#where_clause
109123
{
110124
fn verify(&self, msg: &[u8], signature: &#s_ident) -> ::signature::Result<()> {
@@ -137,12 +151,19 @@ fn emit_digest_signer_impl(input: DeriveInput) -> TokenStream2 {
137151
);
138152

139153
let name = params.name;
154+
let lifetimes = params.lifetimes;
140155
let impl_generics = params.impl_generics;
141156
let ty_generics = params.ty_generics;
142157
let where_clause = params.where_clause;
143158

159+
let sep = if lifetimes.is_empty() {
160+
quote! {}
161+
} else {
162+
quote! {,}
163+
};
164+
144165
quote! {
145-
impl<#(#impl_generics),*> ::signature::DigestSigner<#d_ident, #s_ident> for #name<#(#ty_generics),*>
166+
impl<#(#lifetimes),* #sep #(#impl_generics),*> ::signature::DigestSigner<#d_ident, #s_ident> for #name<#(#lifetimes),* #sep #(#ty_generics),*>
146167
#where_clause
147168
{
148169
fn try_sign_digest(&self, digest: #d_ident) -> ::signature::Result<#s_ident> {
@@ -175,12 +196,19 @@ fn emit_digest_verifier_impl(input: DeriveInput) -> TokenStream2 {
175196
);
176197

177198
let name = params.name;
199+
let lifetimes = params.lifetimes;
178200
let impl_generics = params.impl_generics;
179201
let ty_generics = params.ty_generics;
180202
let where_clause = params.where_clause;
181203

204+
let sep = if lifetimes.is_empty() {
205+
quote! {}
206+
} else {
207+
quote! {,}
208+
};
209+
182210
quote! {
183-
impl<#(#impl_generics),*> ::signature::DigestVerifier<#d_ident, #s_ident> for #name<#(#ty_generics),*>
211+
impl<#(#lifetimes),* #sep #(#impl_generics),*> ::signature::DigestVerifier<#d_ident, #s_ident> for #name<#(#lifetimes),* #sep #(#ty_generics),*>
184212
#where_clause
185213
{
186214
fn verify_digest(&self, digest: #d_ident, signature: &#s_ident) -> ::signature::Result<()> {
@@ -195,6 +223,8 @@ struct DeriveParams {
195223
/// Name of the struct the trait impls are being added to.
196224
name: Ident,
197225

226+
lifetimes: Vec<Lifetime>,
227+
198228
/// Generic parameters of `impl`.
199229
impl_generics: Vec<TypeParam>,
200230

@@ -210,6 +240,12 @@ impl DeriveParams {
210240
fn new(input: DeriveInput) -> Self {
211241
let impl_generics = input.generics.type_params().cloned().collect();
212242

243+
let lifetimes = input
244+
.generics
245+
.lifetimes()
246+
.map(|lt| lt.lifetime.clone())
247+
.collect();
248+
213249
let ty_generics = input
214250
.generics
215251
.type_params()
@@ -227,6 +263,7 @@ impl DeriveParams {
227263

228264
Self {
229265
name: input.ident,
266+
lifetimes,
230267
impl_generics,
231268
ty_generics,
232269
where_clause,
@@ -389,4 +426,37 @@ mod tests {
389426
.to_string()
390427
);
391428
}
429+
430+
#[test]
431+
fn signer_lifetimes() {
432+
let input = parse_quote! {
433+
#[derive(Signer)]
434+
struct MySigner<'a, C>
435+
where
436+
C: EllipticCurve
437+
{
438+
scalar: Scalar<C::ScalarSize>,
439+
_lifetime: &'a (),
440+
}
441+
};
442+
443+
let output = emit_signer_impl(input);
444+
445+
assert_eq!(
446+
output.to_string(),
447+
quote! {
448+
impl<'a, C, __S> ::signature::Signer<__S> for MySigner<'a, C>
449+
where
450+
C: EllipticCurve,
451+
__S: ::signature::PrehashSignature,
452+
Self: ::signature::DigestSigner<__S::Digest, __S>
453+
{
454+
fn try_sign(&self, msg: &[u8]) -> ::signature::Result<__S> {
455+
self.try_sign_digest(__S::Digest::new_with_prefix(msg))
456+
}
457+
}
458+
}
459+
.to_string()
460+
);
461+
}
392462
}

0 commit comments

Comments
 (0)