Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove {Try}FromVal #815

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions Cargo.toml
Expand Up @@ -35,18 +35,18 @@ soroban-token-spec = { version = "0.4.0", path = "soroban-token-spec" }

[workspace.dependencies.soroban-env-common]
version = "0.0.12"
git = "https://github.com/stellar/rs-soroban-env"
rev = "65498c8"
git = "https://github.com/jayz22/rs-soroban-env"
rev = "aae7e79"

[workspace.dependencies.soroban-env-guest]
version = "0.0.12"
git = "https://github.com/stellar/rs-soroban-env"
rev = "65498c8"
git = "https://github.com/jayz22/rs-soroban-env"
rev = "aae7e79"

[workspace.dependencies.soroban-env-host]
version = "0.0.12"
git = "https://github.com/stellar/rs-soroban-env"
rev = "65498c8"
git = "https://github.com/jayz22/rs-soroban-env"
rev = "aae7e79"

[workspace.dependencies.stellar-strkey]
version = "0.0.6"
Expand Down
3 changes: 2 additions & 1 deletion soroban-sdk-macros/src/derive_client.rs
Expand Up @@ -91,7 +91,8 @@ impl<'a> ClientFn<'a> {
};
Type::Verbatim(quote! {
Result<
Result<#t, <#t as soroban_sdk::TryFromVal<soroban_sdk::Env, soroban_sdk::RawVal>>::Error>,
// Result<#t, <#t as soroban_sdk::TryFromVal<soroban_sdk::Env, soroban_sdk::RawVal>>::Error>,
Result<#t, <soroban_sdk::RawVal as soroban_sdk::TryIntoVal<soroban_sdk::Env, #t>>::Error>,
Result<#e, <#e as TryFrom<soroban_sdk::Status>>::Error>
>
})
Expand Down
67 changes: 16 additions & 51 deletions soroban-sdk-macros/src/derive_enum.rs
Expand Up @@ -69,7 +69,7 @@ pub fn derive_type_enum(
if iter.len() > 1 {
return Err(#path::ConversionError);
}
Self::#ident(iter.next().ok_or(#path::ConversionError)??.try_into_val(env)?)
#enum_ident::#ident(iter.next().ok_or(#path::ConversionError)??.try_into_val(env)?)
}
};
let into = quote! { #enum_ident::#ident(ref value) => (#discriminant_const_sym_ident, value).into_val(env) };
Expand All @@ -79,7 +79,7 @@ pub fn derive_type_enum(
return Err(#path::xdr::Error::Invalid);
}
let rv: #path::RawVal = iter.next().ok_or(#path::xdr::Error::Invalid)?.try_into_val(env).map_err(|_| #path::xdr::Error::Invalid)?;
Self::#ident(rv.try_into_val(env).map_err(|_| #path::xdr::Error::Invalid)?)
#enum_ident::#ident(rv.try_into_val(env).map_err(|_| #path::xdr::Error::Invalid)?)
}
};
let into_xdr = quote! { #enum_ident::#ident(value) => (#name, value).try_into().map_err(|_| #path::xdr::Error::Invalid)? };
Expand All @@ -94,7 +94,7 @@ pub fn derive_type_enum(
if iter.len() > 0 {
return Err(#path::ConversionError);
}
Self::#ident
#enum_ident::#ident
}
};
let into = quote! { #enum_ident::#ident => (#discriminant_const_sym_ident,).into_val(env) };
Expand All @@ -103,7 +103,7 @@ pub fn derive_type_enum(
if iter.len() > 0 {
return Err(#path::xdr::Error::Invalid);
}
Self::#ident
#enum_ident::#ident
}
};
let into_xdr = quote! { #enum_ident::#ident => (#name,).try_into().map_err(|_| #path::xdr::Error::Invalid)? };
Expand Down Expand Up @@ -147,13 +147,13 @@ pub fn derive_type_enum(
quote! {
#spec_gen

impl #path::TryFromVal<#path::Env, #path::RawVal> for #enum_ident {
impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::RawVal {
type Error = #path::ConversionError;
#[inline(always)]
fn try_from_val(env: &#path::Env, val: #path::RawVal) -> Result<Self, Self::Error> {
fn try_into_val(self, env: &#path::Env) -> Result<#enum_ident, Self::Error> {
use #path::TryIntoVal;
#(#discriminant_consts)*
let vec: #path::Vec<#path::RawVal> = val.try_into_val(env)?;
let vec: #path::Vec<#path::RawVal> = self.try_into_val(env)?;
let mut iter = vec.iter();
let discriminant = iter.next().ok_or(#path::ConversionError)??;
Ok(match discriminant.get_payload() {
Expand All @@ -163,14 +163,6 @@ pub fn derive_type_enum(
}
}

impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::RawVal {
type Error = #path::ConversionError;
#[inline(always)]
fn try_into_val(self, env: &#path::Env) -> Result<#enum_ident, Self::Error> {
<_ as #path::TryFromVal<_, _>>::try_from_val(env, self)
}
}

impl #path::IntoVal<#path::Env, #path::RawVal> for #enum_ident {
#[inline(always)]
fn into_val(self, env: &#path::Env) -> #path::RawVal {
Expand All @@ -192,14 +184,14 @@ pub fn derive_type_enum(
}

#[cfg(any(test, feature = "testutils"))]
impl #path::TryFromVal<#path::Env, #path::xdr::ScVec> for #enum_ident {
impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::xdr::ScVec {
type Error = #path::xdr::Error;
#[inline(always)]
fn try_from_val(env: &#path::Env, val: #path::xdr::ScVec) -> Result<Self, Self::Error> {
fn try_into_val(self, env: &#path::Env) -> Result<#enum_ident, Self::Error> {
use #path::xdr::Validate;
use #path::TryIntoVal;

let vec = val;
let vec = self;
let mut iter = vec.iter();
let discriminant: #path::xdr::ScSymbol = iter.next().ok_or(#path::xdr::Error::Invalid)?.clone().try_into().map_err(|_| #path::xdr::Error::Invalid)?;
let discriminant_name: &str = &discriminant.to_string()?;
Expand All @@ -212,58 +204,31 @@ pub fn derive_type_enum(
}

#[cfg(any(test, feature = "testutils"))]
impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::xdr::ScVec {
impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::xdr::ScObject {
type Error = #path::xdr::Error;
#[inline(always)]
fn try_into_val(self, env: &#path::Env) -> Result<#enum_ident, Self::Error> {
<_ as #path::TryFromVal<_, _>>::try_from_val(env, self)
}
}

#[cfg(any(test, feature = "testutils"))]
impl #path::TryFromVal<#path::Env, #path::xdr::ScObject> for #enum_ident {
type Error = #path::xdr::Error;
#[inline(always)]
fn try_from_val(env: &#path::Env, val: #path::xdr::ScObject) -> Result<Self, Self::Error> {
if let #path::xdr::ScObject::Vec(vec) = val {
<_ as #path::TryFromVal<_, _>>::try_from_val(env, vec)
if let #path::xdr::ScObject::Vec(vec) = self {
<_ as #path::TryIntoVal<_, _>>::try_into_val(vec, env)
} else {
Err(#path::xdr::Error::Invalid)
}
}
}

#[cfg(any(test, feature = "testutils"))]
impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::xdr::ScObject {
impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::xdr::ScVal {
type Error = #path::xdr::Error;
#[inline(always)]
fn try_into_val(self, env: &#path::Env) -> Result<#enum_ident, Self::Error> {
<_ as #path::TryFromVal<_, _>>::try_from_val(env, self)
}
}

#[cfg(any(test, feature = "testutils"))]
impl #path::TryFromVal<#path::Env, #path::xdr::ScVal> for #enum_ident {
type Error = #path::xdr::Error;
#[inline(always)]
fn try_from_val(env: &#path::Env, val: #path::xdr::ScVal) -> Result<Self, Self::Error> {
if let #path::xdr::ScVal::Object(Some(obj)) = val {
<_ as #path::TryFromVal<_, _>>::try_from_val(env, obj)
if let #path::xdr::ScVal::Object(Some(obj)) = self {
<_ as #path::TryIntoVal<_, _>>::try_into_val(obj, env)
} else {
Err(#path::xdr::Error::Invalid)
}
}
}

#[cfg(any(test, feature = "testutils"))]
impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::xdr::ScVal {
type Error = #path::xdr::Error;
#[inline(always)]
fn try_into_val(self, env: &#path::Env) -> Result<#enum_ident, Self::Error> {
<_ as #path::TryFromVal<_, _>>::try_from_val(env, self)
}
}

#[cfg(any(test, feature = "testutils"))]
impl TryInto<#path::xdr::ScVec> for &#enum_ident {
type Error = #path::xdr::Error;
Expand Down
31 changes: 7 additions & 24 deletions soroban-sdk-macros/src/derive_enum_int.rs
Expand Up @@ -47,7 +47,7 @@ pub fn derive_type_enum_int(
name: name.try_into().unwrap_or_else(|_| StringM::default()),
value: discriminant,
};
let try_from = quote! { #discriminant => Self::#ident };
let try_from = quote! { #discriminant => #enum_ident::#ident };
let into = quote! { #enum_ident::#ident => #discriminant.into_val(env) };
(spec_case, try_from, into)
})
Expand Down Expand Up @@ -88,27 +88,19 @@ pub fn derive_type_enum_int(
quote! {
#spec_gen

impl #path::TryFromVal<#path::Env, #path::RawVal> for #enum_ident {
impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::RawVal {
type Error = #path::ConversionError;
#[inline(always)]
fn try_from_val(env: &#path::Env, val: #path::RawVal) -> Result<Self, Self::Error> {
fn try_into_val(self, env: &#path::Env) -> Result<#enum_ident, Self::Error> {
use #path::TryIntoVal;
let discriminant: u32 = val.try_into_val(env)?;
let discriminant: u32 = self.try_into_val(env)?;
Ok(match discriminant {
#(#try_froms,)*
_ => Err(#path::ConversionError{})?,
})
}
}

impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::RawVal {
type Error = #path::ConversionError;
#[inline(always)]
fn try_into_val(self, env: &#path::Env) -> Result<#enum_ident, Self::Error> {
<_ as #path::TryFromVal<_, _>>::try_from_val(env, self)
}
}

impl #path::IntoVal<#path::Env, #path::RawVal> for #enum_ident {
#[inline(always)]
fn into_val(self, env: &#path::Env) -> #path::RawVal {
Expand All @@ -128,27 +120,18 @@ pub fn derive_type_enum_int(
}

#[cfg(any(test, feature = "testutils"))]
impl #path::TryFromVal<#path::Env, #path::xdr::ScVal> for #enum_ident {
impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::xdr::ScVal {
type Error = #path::xdr::Error;
#[inline(always)]
fn try_from_val(env: &#path::Env, val: #path::xdr::ScVal) -> Result<Self, Self::Error> {
let discriminant: u32 = val.try_into().map_err(|_| #path::xdr::Error::Invalid)?;
fn try_into_val(self, env: &#path::Env) -> Result<#enum_ident, Self::Error> {
let discriminant: u32 = self.try_into().map_err(|_| #path::xdr::Error::Invalid)?;
Ok(match discriminant {
#(#try_froms,)*
_ => Err(#path::xdr::Error::Invalid)?,
})
}
}

#[cfg(any(test, feature = "testutils"))]
impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::xdr::ScVal {
type Error = #path::xdr::Error;
#[inline(always)]
fn try_into_val(self, env: &#path::Env) -> Result<#enum_ident, Self::Error> {
<_ as #path::TryFromVal<_, _>>::try_from_val(env, self)
}
}

#[cfg(any(test, feature = "testutils"))]
impl TryInto<#path::xdr::ScVal> for &#enum_ident {
type Error = #path::xdr::Error;
Expand Down
14 changes: 3 additions & 11 deletions soroban-sdk-macros/src/derive_error_enum_int.rs
Expand Up @@ -125,21 +125,13 @@ pub fn derive_type_error_enum_int(
}
}

impl #path::TryFromVal<#path::Env, #path::RawVal> for #enum_ident {
type Error = #path::ConversionError;
#[inline(always)]
fn try_from_val(env: &#path::Env, val: #path::RawVal) -> Result<Self, Self::Error> {
use #path::TryIntoVal;
let status: #path::Status = val.try_into_val(env)?;
status.try_into().map_err(|_| #path::ConversionError)
}
}

impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::RawVal {
type Error = #path::ConversionError;
#[inline(always)]
fn try_into_val(self, env: &#path::Env) -> Result<#enum_ident, Self::Error> {
<_ as #path::TryFromVal<_, _>>::try_from_val(env, self)
use #path::TryIntoVal;
let status: #path::Status = self.try_into_val(env)?;
status.try_into().map_err(|_| #path::ConversionError)
}
}

Expand Down
25 changes: 16 additions & 9 deletions soroban-sdk-macros/src/derive_fn.rs
Expand Up @@ -65,14 +65,17 @@ pub fn derive_fn(
Ok(type_) => {
let name = name.try_into().unwrap_or_else(|_| {
const MAX: u32 = 30;
errors.push(Error::new(ident.span(), format!("argument name too long, max length {} characters", MAX)));
errors.push(Error::new(
ident.span(),
format!("argument name too long, max length {} characters", MAX),
));
StringM::<MAX>::default()
});
ScSpecFunctionInputV0{ name, type_ }
},
ScSpecFunctionInputV0 { name, type_ }
}
Err(e) => {
errors.push(e);
ScSpecFunctionInputV0{
ScSpecFunctionInputV0 {
name: "arg".try_into().unwrap(),
type_: ScSpecTypeDef::I32,
}
Expand All @@ -93,17 +96,21 @@ pub fn derive_fn(
});
let call = quote! {
<_ as soroban_sdk::unwrap::UnwrapOptimized>::unwrap_optimized(
<_ as soroban_sdk::TryFromVal<soroban_sdk::Env, soroban_sdk::RawVal>>::try_from_val(
&env,
#ident
)
<soroban_sdk::RawVal as soroban_sdk::TryIntoVal<soroban_sdk::Env, _>>::try_into_val(#ident, &env)
)
};
(spec, arg, call)
}
FnArg::Receiver(_) => {
errors.push(Error::new(a.span(), "self argument not supported"));
(ScSpecFunctionInputV0{ name: "".try_into().unwrap(), type_: ScSpecTypeDef::I32 } , a.clone(), quote! {})
(
ScSpecFunctionInputV0 {
name: "".try_into().unwrap(),
type_: ScSpecTypeDef::I32,
},
a.clone(),
quote! {},
)
}
})
.multiunzip();
Expand Down