Atualmente, implementar uma macro personalizada derive
não requer Trait
que um real exista. Tudo o que ele faz é anexar um bloco de código arbitrário após o item anotado e, aparentemente, remover os "atributos auxiliares" dele. Ou seja, podemos fazer algo como o seguinte:
#[proc_macro_derive(FakeTrait)]
pub fn custom_derive(input: TokenStream) -> TokenStream {
let name = ... // Get the ident name from input
....
quote! {
impl #name {
fn custom_function(...) {
...
}
}
}.into()
}
E então podemos usar essa macro em uma struct
via
#[derive(FakeTrait)]
struct MyStruct {...}
e funcionará alegremente anexando o impl MyStruct
a ele, independentemente da existência de FakeTrait
.
Minha pergunta é se é um caso de uso aceitável para derive
macros? Há alguma desvantagem e pode acontecer de quebrar no futuro?
É certamente o caso mais comum em que macros derive geram uma implementação para um trait com o mesmo nome, mas isso não é imposto. Então, provavelmente, desde que esteja claro o que sua macro está fazendo, provavelmente seria "aceitável".
Para o estado da técnica: a caixa enum_as_inner expõe a
EnumAsInner
macro derive que não gera nenhuma implementação de característica e, em vez disso, gera métodos inerentes.