Comments (6)
On that note, the clash between wanting to keep parts of a struct private and this breaking initializiation patterns has been discussed elsewhere.
There is also a related, old RFC.
My point would be that until (or if ever) this is supported by the compiler, if you have a struct that you want to support initializing with the init-struct pattern while keeping some of its fields private, the straightforward option is to make a 2nd struct, just for the pattern. I.e.:
pub struct Foo {
pub a: u32,
pub b: i32
c: f32,
}
#[derive(Default)]
pub struct FooInit {
pub a: u32,
pub b: i32,
}
impl From<FooInit> for Foo {
...
}
struct Bar {
foo: Foo,
...
}
impl Bar {
pub fn with_foo(foo: Foo) {
...
}
}
Then you use that:
let bar = Bar::new()
.with_foo(FooInit {
a: 42,
..default::Default()
}.into());
from cbindgen.
cbindgen
follows cargo semver, so version 0.25 -> 0.26 allows breaking changes. The previous issue was because 0.25.x -> 0.25.y should not contain any breaking changes.
from cbindgen.
I opened the issue not to report a breaking API change but what I (and others, see #841) deem a questionable API design decision.
That it is a breaking change is perfectly acceptable per se, just not the reason why. 😉
from cbindgen.
Basically, this forces one to do this:
cbindgen::Builder::new()
.with_crate(std::env::var("CARGO_MANIFEST_DIR").unwrap())
.with_config({
let mut config = cbindgen::Config::default();
config.language = cbindgen::Language::C;
config.braces = cbindgen::Braces::SameLine;
config.cpp_compat = true;
config.style = cbindgen::Style::Both;
config
})
.generate()?
.write_to_file("binding.h");
This is neither canonical Rust nor the intended use of the init-struct-pattern employed here.
Suggestion: separate the internally used (private) config struct from the public one used to configure the binding generator.
from cbindgen.
I am also seeing this issue when working on https://github.com/fzyzcjy/flutter_rust_bridge. Looking forward to seeing it fixed!
from cbindgen.
I'm not saying I would do this.
I'd just not have partially private structs. I think the added safety the former provides is dwarfed by the cumbersome workarounds required to keep UX pleasant. See code above.
from cbindgen.
Related Issues (20)
- Types not exported when using build script but CLI works HOT 2
- rename type by annotation HOT 1
- Modules inside cfg_if! macros aren't read / expanded (was: The C header file cannot be generated correctly.) HOT 2
- Incorrect (outdated?) `fetch_all_dependencies` config suggestion HOT 3
- derive-{eq,neq} doesn't account for #[cfg()]d fields.
- [Feature Request] GObject support HOT 2
- cbindgen emits constants in spite of no-export and/or ignore annotations HOT 6
- WARN: Skip unsupported call expression HOT 1
- Generate C packed struct HOT 2
- `defines` is not applied for impl const HOT 1
- How do I mark a struct variable volatile? HOT 1
- Feature request: transparent/erased typedefs HOT 1
- How to do Vec<String>?
- Macro generated functions are ignored in header generation HOT 2
- Linking to multiple ffi crates fails HOT 2
- incorrect typedef order with circular dependency
- Function parameter annotations
- New cbindgen release? HOT 3
- Add support for std::mem::offset_of HOT 1
- Incorrect equality operator generated with `derive_eq=true` HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cbindgen.