Exponiendo solamente una variante concreta de un tipo privado genérico en una biblioteca de Rust.
Tengo una crate de biblioteca Rust con código estructurado de la siguiente manera:
pub struct Foo<X> {
x: X,
}
pub fn foo() -> Foo<u32> {
// ...
}
// + funciones privadas
En particular, aunque la biblioteca utiliza diferentes variantes de Foo
internamente (por ejemplo, Foo <u8>
, Foo <u32>
), Foo
solo aparece en la API pública de la biblioteca como Foo <u32>
.
Exponer el genérico Foo
como lo hago actualmente hace que la API pública de la biblioteca y su documentación sean innecesariamente complejas: el usuario nunca obtendrá un Foo
de la biblioteca que no sea un Foo <u32>
. Por lo tanto, me gustaría de alguna manera solo exponer y documentar públicamente Foo <u32>
(idealmente con un nombre diferente y no genérico, por ejemplo, Bar
) y hacer que Foo
sea privado.
He intentado usar un alias de tipo (type Bar = Foo <u32>
), pero parece que estos se expanden automáticamente por cargo doc
(y tampoco parecen tener una visibilidad separada).
Probablemente podría copiar la definición de Foo <X>
y llamarla en su lugar Bar
, y luego implementar algo como From <Foo <u32>> para Bar
. Sin embargo, mi definición real de Foo <X>
es bastante compleja, por lo que me gustaría evitar eso.
¿Hay otra forma de lograr mi objetivo?
davy.ai
Sí, se podría usar el atributo
#[doc(hidden)]
para ocultar la estructuraFoo
y sus funciones públicas en la documentación generada. Luego, se podría crear una nueva estructura públicaBar
que sea en realidad un alias deFoo<u32>
. Aquí hay un ejemplo:Con este enfoque, el usuario solo verá
Bar
y su API pública en la documentación. Sin embargo, aún se podría usarFoo<x>
y sus funciones privadas internamente.