GithubHelp home page GithubHelp logo

Comments (6)

virtualritz avatar virtualritz commented on July 24, 2024 1

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.

jschwe avatar jschwe commented on July 24, 2024

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.

virtualritz avatar virtualritz commented on July 24, 2024

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.

virtualritz avatar virtualritz commented on July 24, 2024

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.

fzyzcjy avatar fzyzcjy commented on July 24, 2024

I am also seeing this issue when working on https://github.com/fzyzcjy/flutter_rust_bridge. Looking forward to seeing it fixed!

from cbindgen.

virtualritz avatar virtualritz commented on July 24, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.