A library for exposing non public types, fields, and functions from a crate.
The libraries I use often expose *most* of their lower level details but forget
to mark a few structs or fields as public. Necessitating me to copy over the
struct, a load of traits, all the methods I need, everything those traits
and methods need to import, and all the crates they use. Just for me to be able
to add "`pub`" in front of it.
Most functionality is implemented but this is mainly meant for testing or
debugging and is still a work in progress. So don't use this for production
code.
# Features and Roadmap
- [x] copy definition
- [x] change visibility
- [x] most items: `const`, `enum`, `fn`, `macro_rules`, `static`, `struct`, `trait`, `union`
- [~] attributes
- [x] std library crates
- ~~[ ] support not specifying crate verion/dont use file system paths~~
- [ ] support not specifying rustc version
- [?] copying modules
- [ ] re-exports
- [ ] recursivly copying item dependancies
- [ ] "safe"-ish transmutes
## Ideas
- enforcing, changing, adding, removing, ignoring:
- [x] items variant (`Struct`, `fn`, etc)
- [ ] field names
- [ ] field types
- [ ] field size, alignment
- [ ] associated types and constants
- [ ] method arguments
- [ ] method return value
# Example
```rust
use pastiche::pastiche_attr;
use std::num::IntErrorKind;
use std::str::FromStr;
/// A new type that shadows the definition and attributes at
/// [`core::num::ParseIntError`].
/// Internally it searches the fs and copy-pastes the definition.
#[pastiche_attr]
#[pastiche_crate = "stable@1.82.0"]
// NOTE: doesn't support re-exports rn, so we have to specify the
// "real" module path
#[pastiche_path = "core::num::error::ParseIntError"]
#[pastiche_sub_vis(pub)] // set fields to public
pub struct MyParseIntError {
// body is ignored for now
}
fn main() {
// We can now directly construct a ParseIntError.
let my_error = MyParseIntError { kind: IntErrorKind::InvalidDigit };
dbg!(&my_error);
// Rather than having to fail a parse. :/
let std_error = i32::from_str("baddbeef").unwrap_err();
dbg!(&std_error);
assert_eq!(&my_error.kind, std_error.kind());
}
```
## License
Licensed under either of
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license ([LICENSE-MIT](LICENSE-MIT) or https://opensource.org/licenses/MIT)
at your option.
### Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.