Codegen is generating incorrect rust code with an enum method
jquesada2016 opened this issue · comments
Describe the bug
I have the following definition:
use crate::api::{config, surrealdb::SurrealDB};
pub enum SignInScreen {
SignIn {
email: String,
password: String,
},
ChangePassword {
current_password: String,
new_password: String,
},
}
impl SignInScreen {
#[frb(sync)]
pub fn new() -> Self {
Self::SignIn {
email: config::DEFAULT_EMAIL.into(),
password: config::DEFAULT_PASSWORD.into(),
}
}
pub async fn sign_in(self, db: SurrealDB) -> Result<Option<Self>, SignInError> {
todo!();
}
}
#[derive(Debug, thiserror::Error)]
pub enum SignInError {
#[error("error from SurrealDB: {}", .0)]
DBError(surrealdb::Error),
#[error("wrong email/password")]
InvalidCredentials,
}
This gives the following error:
error[E0308]: mismatched types
--> src\frb_generated.rs:67:78
|
67 | ... crate::api::screens::sign_in::SignInScreen::sign_in(&api_that, api_db).await
| --------------------------------------------------- ^^^^^^^^^ expected `SignInScreen`, found `&SignInScreen`
| |
| arguments to this function are incorrect
|
note: method defined here
--> src\api\screens\sign_in.rs:23:18
|
23 | pub async fn sign_in(self, db: SurrealDB) -> Result<Option<Self>, SignInError> {
| ^^^^^^^ ----
help: consider removing the borrow
|
67 - crate::api::screens::sign_in::SignInScreen::sign_in(&api_that, api_db).await
67 + crate::api::screens::sign_in::SignInScreen::sign_in(api_that, api_db).await
|
If I manually remove the &
, then it works correctly.
Here, SurrealDB
is an opaque struct with the following definition:
use surrealdb::{
engine::remote::ws::{Client, Ws},
Surreal,
};
use super::config;
#[derive(derive_more::Deref)]
pub struct SurrealDB(Surreal<Client>);
impl SurrealDB {
pub async fn new() -> Result<Self, surrealdb::Error> {
let db = Surreal::new::<Ws>(config::SURREAL_URL).await?;
Ok(Self(db))
}
}
Steps to reproduce
Hint: A simple way to reproduce is to clone and modify the https://github.com/fzyzcjy/flutter_rust_bridge/tree/master/frb_example/dart_minimal example package according to your needs.
- ...
- ...
- ...
Logs
Outside of my specific code, not sure how to repro...
Expected behavior
No response
Generated binding code
// This file is automatically generated, so please do not edit it.
// Generated by `flutter_rust_bridge`@ 2.0.0-dev.28.
#![allow(
non_camel_case_types,
unused,
non_snake_case,
clippy::needless_return,
clippy::redundant_closure_call,
clippy::redundant_closure,
clippy::useless_conversion,
clippy::unit_arg,
clippy::unused_unit,
clippy::double_parens,
clippy::let_and_return,
clippy::too_many_arguments,
clippy::match_single_binding
)]
// Section: imports
use crate::api::screens::sign_in::*;
use crate::api::surrealdb::*;
use flutter_rust_bridge::for_generated::byteorder::{NativeEndian, ReadBytesExt, WriteBytesExt};
use flutter_rust_bridge::for_generated::transform_result_dco;
use flutter_rust_bridge::{Handler, IntoIntoDart};
// Section: boilerplate
flutter_rust_bridge::frb_generated_boilerplate!(
default_stream_sink_codec = SseCodec,
default_rust_opaque = RustOpaqueMoi,
default_rust_auto_opaque = RustAutoOpaqueMoi,
);
const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.0.0-dev.28";
// Section: executor
flutter_rust_bridge::frb_generated_default_handler!();
// Section: wire_funcs
fn wire_app_name_impl(
ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
rust_vec_len_: i32,
data_len_: i32,
) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse {
FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::<flutter_rust_bridge::for_generated::SseCodec, _>(
flutter_rust_bridge::for_generated::TaskInfo {
debug_name: "app_name",
port: None,
mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync,
},
move || {
let message = unsafe {
flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(
ptr_,
rust_vec_len_,
data_len_,
)
};
let mut deserializer =
flutter_rust_bridge::for_generated::SseDeserializer::new(message);
deserializer.end();
transform_result_sse((move || Result::<_, ()>::Ok(crate::api::config::app_name()))())
},
)
}
fn wire_SignInScreen_new_impl(
ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
rust_vec_len_: i32,
data_len_: i32,
) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse {
FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::<flutter_rust_bridge::for_generated::SseCodec, _>(
flutter_rust_bridge::for_generated::TaskInfo {
debug_name: "SignInScreen_new",
port: None,
mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync,
},
move || {
let message = unsafe {
flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(
ptr_,
rust_vec_len_,
data_len_,
)
};
let mut deserializer =
flutter_rust_bridge::for_generated::SseDeserializer::new(message);
deserializer.end();
transform_result_sse((move || {
Result::<_, ()>::Ok(crate::api::screens::sign_in::SignInScreen::new())
})())
},
)
}
fn wire_SignInScreen_sign_in_impl(
port_: flutter_rust_bridge::for_generated::MessagePort,
ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
rust_vec_len_: i32,
data_len_: i32,
) {
FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::<flutter_rust_bridge::for_generated::SseCodec, _, _, _>(
flutter_rust_bridge::for_generated::TaskInfo {
debug_name: "SignInScreen_sign_in",
port: Some(port_),
mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal,
},
move || {
let message = unsafe {
flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(
ptr_,
rust_vec_len_,
data_len_,
)
};
let mut deserializer =
flutter_rust_bridge::for_generated::SseDeserializer::new(message);
let api_that =
<crate::api::screens::sign_in::SignInScreen>::sse_decode(&mut deserializer);
let api_db = <SurrealDB>::sse_decode(&mut deserializer);
deserializer.end();
move |context| async move {
transform_result_sse(
(move || async move {
crate::api::screens::sign_in::SignInScreen::sign_in(&api_that, api_db).await
})()
.await,
)
}
},
)
}
fn wire_SurrealDB_new_impl(
port_: flutter_rust_bridge::for_generated::MessagePort,
ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
rust_vec_len_: i32,
data_len_: i32,
) {
FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::<flutter_rust_bridge::for_generated::SseCodec, _, _, _>(
flutter_rust_bridge::for_generated::TaskInfo {
debug_name: "SurrealDB_new",
port: Some(port_),
mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal,
},
move || {
let message = unsafe {
flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(
ptr_,
rust_vec_len_,
data_len_,
)
};
let mut deserializer =
flutter_rust_bridge::for_generated::SseDeserializer::new(message);
deserializer.end();
move |context| async move {
transform_result_sse(
(move || async move { crate::api::surrealdb::SurrealDB::new().await })().await,
)
}
},
)
}
// Section: related_funcs
flutter_rust_bridge::frb_generated_moi_arc_impl_value!(
flutter_rust_bridge::for_generated::rust_async::RwLock<SignInError>
);
flutter_rust_bridge::frb_generated_moi_arc_impl_value!(
flutter_rust_bridge::for_generated::rust_async::RwLock<SurrealDB>
);
flutter_rust_bridge::frb_generated_moi_arc_impl_value!(
flutter_rust_bridge::for_generated::rust_async::RwLock<surrealdb::Error>
);
// Section: dart2rust
impl SseDecode for SignInError {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut inner = <RustOpaqueMoi<
flutter_rust_bridge::for_generated::rust_async::RwLock<SignInError>,
>>::sse_decode(deserializer);
return inner.rust_auto_opaque_decode_owned();
}
}
impl SseDecode for SurrealDB {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut inner = <RustOpaqueMoi<
flutter_rust_bridge::for_generated::rust_async::RwLock<SurrealDB>,
>>::sse_decode(deserializer);
return inner.rust_auto_opaque_decode_owned();
}
}
impl SseDecode for surrealdb::Error {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut inner = <RustOpaqueMoi<
flutter_rust_bridge::for_generated::rust_async::RwLock<surrealdb::Error>,
>>::sse_decode(deserializer);
return inner.rust_auto_opaque_decode_owned();
}
}
impl SseDecode
for RustOpaqueMoi<flutter_rust_bridge::for_generated::rust_async::RwLock<SignInError>>
{
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut inner = <usize>::sse_decode(deserializer);
return decode_rust_opaque_moi(inner);
}
}
impl SseDecode
for RustOpaqueMoi<flutter_rust_bridge::for_generated::rust_async::RwLock<SurrealDB>>
{
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut inner = <usize>::sse_decode(deserializer);
return decode_rust_opaque_moi(inner);
}
}
impl SseDecode
for RustOpaqueMoi<flutter_rust_bridge::for_generated::rust_async::RwLock<surrealdb::Error>>
{
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut inner = <usize>::sse_decode(deserializer);
return decode_rust_opaque_moi(inner);
}
}
impl SseDecode for String {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut inner = <Vec<u8>>::sse_decode(deserializer);
return String::from_utf8(inner).unwrap();
}
}
impl SseDecode for Vec<u8> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut len_ = <i32>::sse_decode(deserializer);
let mut ans_ = vec![];
for idx_ in 0..len_ {
ans_.push(<u8>::sse_decode(deserializer));
}
return ans_;
}
}
impl SseDecode for Option<crate::api::screens::sign_in::SignInScreen> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
if (<bool>::sse_decode(deserializer)) {
return Some(<crate::api::screens::sign_in::SignInScreen>::sse_decode(
deserializer,
));
} else {
return None;
}
}
}
impl SseDecode for crate::api::screens::sign_in::SignInScreen {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut tag_ = <i32>::sse_decode(deserializer);
match tag_ {
0 => {
let mut var_email = <String>::sse_decode(deserializer);
let mut var_password = <String>::sse_decode(deserializer);
return crate::api::screens::sign_in::SignInScreen::SignIn {
email: var_email,
password: var_password,
};
}
1 => {
let mut var_currentPassword = <String>::sse_decode(deserializer);
let mut var_newPassword = <String>::sse_decode(deserializer);
return crate::api::screens::sign_in::SignInScreen::ChangePassword {
current_password: var_currentPassword,
new_password: var_newPassword,
};
}
_ => {
unimplemented!("");
}
}
}
}
impl SseDecode for u8 {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
deserializer.cursor.read_u8().unwrap()
}
}
impl SseDecode for () {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {}
}
impl SseDecode for usize {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
deserializer.cursor.read_u64::<NativeEndian>().unwrap() as _
}
}
impl SseDecode for i32 {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
deserializer.cursor.read_i32::<NativeEndian>().unwrap()
}
}
impl SseDecode for bool {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
deserializer.cursor.read_u8().unwrap() != 0
}
}
fn pde_ffi_dispatcher_primary_impl(
func_id: i32,
port: flutter_rust_bridge::for_generated::MessagePort,
ptr: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
rust_vec_len: i32,
data_len: i32,
) {
// Codec=Pde (Serialization + dispatch), see doc to use other codecs
match func_id {
3 => wire_SignInScreen_sign_in_impl(port, ptr, rust_vec_len, data_len),
4 => wire_SurrealDB_new_impl(port, ptr, rust_vec_len, data_len),
_ => unreachable!(),
}
}
fn pde_ffi_dispatcher_sync_impl(
func_id: i32,
ptr: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
rust_vec_len: i32,
data_len: i32,
) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse {
// Codec=Pde (Serialization + dispatch), see doc to use other codecs
match func_id {
1 => wire_app_name_impl(ptr, rust_vec_len, data_len),
2 => wire_SignInScreen_new_impl(ptr, rust_vec_len, data_len),
_ => unreachable!(),
}
}
// Section: rust2dart
pub struct Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSignInError(
SignInError,
);
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart
for Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSignInError
{
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0)
.into_dart()
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSignInError
{
}
impl
flutter_rust_bridge::IntoIntoDart<
Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSignInError,
> for SignInError
{
fn into_into_dart(
self,
) -> Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSignInError
{
Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSignInError(
self,
)
}
}
pub struct Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSurrealDB(
SurrealDB,
);
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart
for Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSurrealDB
{
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0)
.into_dart()
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSurrealDB
{
}
impl
flutter_rust_bridge::IntoIntoDart<
Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSurrealDB,
> for SurrealDB
{
fn into_into_dart(
self,
) -> Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSurrealDB {
Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockSurrealDB(self)
}
}
pub struct Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLocksurrealdbError(
surrealdb::Error,
);
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart
for Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLocksurrealdbError
{
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0)
.into_dart()
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLocksurrealdbError
{
}
impl
flutter_rust_bridge::IntoIntoDart<
Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLocksurrealdbError,
> for surrealdb::Error
{
fn into_into_dart(
self,
) -> Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLocksurrealdbError
{
Local_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLocksurrealdbError(
self,
)
}
}
// Codec=Dco (DartCObject based), see doc to use other codecs
impl flutter_rust_bridge::IntoDart for crate::api::screens::sign_in::SignInScreen {
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
match self {
crate::api::screens::sign_in::SignInScreen::SignIn { email, password } => [
0.into_dart(),
email.into_into_dart().into_dart(),
password.into_into_dart().into_dart(),
]
.into_dart(),
crate::api::screens::sign_in::SignInScreen::ChangePassword {
current_password,
new_password,
} => [
1.into_dart(),
current_password.into_into_dart().into_dart(),
new_password.into_into_dart().into_dart(),
]
.into_dart(),
}
}
}
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
for crate::api::screens::sign_in::SignInScreen
{
}
impl flutter_rust_bridge::IntoIntoDart<crate::api::screens::sign_in::SignInScreen>
for crate::api::screens::sign_in::SignInScreen
{
fn into_into_dart(self) -> crate::api::screens::sign_in::SignInScreen {
self
}
}
impl SseEncode for SignInError {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<RustOpaqueMoi<flutter_rust_bridge::for_generated::rust_async::RwLock<SignInError>>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer);
}
}
impl SseEncode for SurrealDB {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<RustOpaqueMoi<flutter_rust_bridge::for_generated::rust_async::RwLock<SurrealDB>>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer);
}
}
impl SseEncode for surrealdb::Error {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<RustOpaqueMoi<flutter_rust_bridge::for_generated::rust_async::RwLock<surrealdb :: Error>>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer);
}
}
impl SseEncode
for RustOpaqueMoi<flutter_rust_bridge::for_generated::rust_async::RwLock<SignInError>>
{
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
let (ptr, size) = self.sse_encode_raw();
<usize>::sse_encode(ptr, serializer);
<i32>::sse_encode(size, serializer);
}
}
impl SseEncode
for RustOpaqueMoi<flutter_rust_bridge::for_generated::rust_async::RwLock<SurrealDB>>
{
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
let (ptr, size) = self.sse_encode_raw();
<usize>::sse_encode(ptr, serializer);
<i32>::sse_encode(size, serializer);
}
}
impl SseEncode
for RustOpaqueMoi<flutter_rust_bridge::for_generated::rust_async::RwLock<surrealdb::Error>>
{
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
let (ptr, size) = self.sse_encode_raw();
<usize>::sse_encode(ptr, serializer);
<i32>::sse_encode(size, serializer);
}
}
impl SseEncode for String {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<Vec<u8>>::sse_encode(self.into_bytes(), serializer);
}
}
impl SseEncode for Vec<u8> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<i32>::sse_encode(self.len() as _, serializer);
for item in self {
<u8>::sse_encode(item, serializer);
}
}
}
impl SseEncode for Option<crate::api::screens::sign_in::SignInScreen> {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<bool>::sse_encode(self.is_some(), serializer);
if let Some(value) = self {
<crate::api::screens::sign_in::SignInScreen>::sse_encode(value, serializer);
}
}
}
impl SseEncode for crate::api::screens::sign_in::SignInScreen {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
match self {
crate::api::screens::sign_in::SignInScreen::SignIn { email, password } => {
<i32>::sse_encode(0, serializer);
<String>::sse_encode(email, serializer);
<String>::sse_encode(password, serializer);
}
crate::api::screens::sign_in::SignInScreen::ChangePassword {
current_password,
new_password,
} => {
<i32>::sse_encode(1, serializer);
<String>::sse_encode(current_password, serializer);
<String>::sse_encode(new_password, serializer);
}
}
}
}
impl SseEncode for u8 {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
serializer.cursor.write_u8(self).unwrap();
}
}
impl SseEncode for () {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {}
}
impl SseEncode for usize {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
serializer
.cursor
.write_u64::<NativeEndian>(self as _)
.unwrap();
}
}
impl SseEncode for i32 {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
serializer.cursor.write_i32::<NativeEndian>(self).unwrap();
}
}
impl SseEncode for bool {
// Codec=Sse (Serialization based), see doc to use other codecs
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
serializer.cursor.write_u8(self as _).unwrap();
}
}
#[cfg(not(target_family = "wasm"))]
#[path = "frb_generated.io.rs"]
mod io;
#[cfg(not(target_family = "wasm"))]
pub use io::*;
/// cbindgen:ignore
#[cfg(target_family = "wasm")]
#[path = "frb_generated.web.rs"]
mod web;
#[cfg(target_family = "wasm")]
pub use web::*;
OS
No response
Version of flutter_rust_bridge_codegen
2.0.0-dev.28
Flutter info
No response
Version of clang++
No response
Additional context
No response
Currently, for non-opaque struct/enums, you need to write &self
(fn sign_in(&self)
). If you really need self
, feel free to reply and I would love to know more details!
Thanks!
Yeah, I need to take self
because I'm using the enum to model a non type-safe state machine, where once you call sign_in()
, you can't use the current model anymore, and should throw an error if you attempt to do so.
When I make your suggested change to take &self
, the rust code is generated correctly, but no methods are added to the dart class for the enum. In this case neither new()
nor sign_in()
are being generated on the dart side.
Edit:
After further testing, there seems to be a few things not being generated correctly for enums, for both opaque and non-opaque variants.
For opaque, async constructor (new) is generated, but not a sync one (with #[frb(sync)]
).
With non-opaque, no methods are being generated on enums, sync or otherwise.
Yeah, I need to take self because I'm using the enum to model a non type-safe state machine, where once you call sign_in(), you can't use the current model anymore, and should throw an error if you attempt to do so.
Then you need to add #[frb(opaque)]
to the enum. Otherwise, it is translatable, and anyone can construct many raw instances on the Dart side - which violates the state machine you want to build.
After further testing, there seems to be a few things not being generated correctly for enums, for both opaque and non-opaque variants.
This looks like a bug. Could you please provide a minimal reproducible sample?
Yeah, I ended up adding an opaque attribute in order to get move semantics.
I will try to create a repro as soon as possible, but I do appologize that it might be until the end of the month.
Take your time!