Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
jayz22 committed Jan 5, 2023
1 parent 7a02609 commit 058106a
Show file tree
Hide file tree
Showing 21 changed files with 636 additions and 633 deletions.
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
126 changes: 80 additions & 46 deletions soroban-sdk-macros/src/derive_enum.rs
Expand Up @@ -147,13 +147,29 @@ pub fn derive_type_enum(
quote! {
#spec_gen

impl #path::TryFromVal<#path::Env, #path::RawVal> for #enum_ident {
// 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;
// #(#discriminant_consts)*
// let vec: #path::Vec<#path::RawVal> = val.try_into_val(env)?;
// let mut iter = vec.iter();
// let discriminant = iter.next().ok_or(#path::ConversionError)??;
// Ok(match discriminant.get_payload() {
// #(#try_froms,)*
// _ => Err(#path::ConversionError{})?,
// })
// }
// }

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 +179,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 @@ -191,15 +199,36 @@ pub fn derive_type_enum(
}
}

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

// let vec = val;
// 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()?;

// Ok(match discriminant_name {
// #(#try_from_xdrs,)*
// _ => Err(#path::xdr::Error::Invalid)?,
// })
// }
// }

#[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> {
// <_ as #path::TryFromVal<_, _>>::try_from_val(env, self)
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 @@ -211,56 +240,61 @@ pub fn derive_type_enum(
}
}

#[cfg(any(test, feature = "testutils"))]
impl #path::TryIntoVal<#path::Env, #enum_ident> for #path::xdr::ScVec {
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)
} else {
Err(#path::xdr::Error::Invalid)
}
}
}
// #[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)
// } else {
// Err(#path::xdr::Error::Invalid)
// }
// }
// }

#[cfg(any(test, feature = "testutils"))]
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)
}
}
// <_ 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::ScObject::Vec(vec) = self {
// <_ as #path::TryFromVal<_, _>>::try_from_val(env, vec)
<_ as #path::TryIntoVal<_, _>>::try_into_val(vec, env)
} else {
Err(#path::xdr::Error::Invalid)
}

}
}

// #[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)
// } 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)
// <_ as #path::TryFromVal<_, _>>::try_from_val(env, self)
if let #path::xdr::ScVal::Object(Some(obj)) = self {
// <_ as #path::TryFromVal<_, _>>::try_from_val(env, obj)
<_ as #path::TryIntoVal<_, _>>::try_into_val(env, obj)
} else {
Err(#path::xdr::Error::Invalid)
}
}
}

Expand Down
57 changes: 34 additions & 23 deletions soroban-sdk-macros/src/derive_enum_int.rs
Expand Up @@ -88,27 +88,33 @@ pub fn derive_type_enum_int(
quote! {
#spec_gen

impl #path::TryFromVal<#path::Env, #path::RawVal> for #enum_ident {
// 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 discriminant: u32 = val.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_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> {
// <_ as #path::TryFromVal<_, _>>::try_from_val(env, self)
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 @@ -127,28 +133,33 @@ pub fn derive_type_enum_int(
}
}

// #[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> {
// let discriminant: u32 = val.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::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> {
// <_ as #path::TryFromVal<_, _>>::try_from_val(env, self)
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
23 changes: 13 additions & 10 deletions soroban-sdk-macros/src/derive_error_enum_int.rs
Expand Up @@ -125,21 +125,24 @@ 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::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)
// <_ 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

0 comments on commit 058106a

Please sign in to comment.