-
Notifications
You must be signed in to change notification settings - Fork 259
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
doc: impl details of #[callback_unwrap]
#1319
Changes from 7 commits
72006ec
17deb8c
4c3b6c2
e5c1126
ebc93de
b28864a
40196cb
022c9af
7fe8625
bd7a8c8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -453,6 +453,45 @@ extern crate quickcheck; | |
/// - [examples/adder](https://github.com/near/near-sdk-rs/blob/9596835369467cac6198e8de9a4b72a38deee4a5/examples/adder/src/lib.rs?plain=1#L31) | ||
/// - [examples/callback-results](https://github.com/near/near-sdk-rs/blob/9596835369467cac6198e8de9a4b72a38deee4a5/examples/callback-results/src/lib.rs?plain=1#L51) | ||
dj8yfo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
/// | ||
/// ### Implementation details of `#[callback_unwrap]` macro and **host functions** calls used | ||
/// | ||
/// ```rust | ||
/// # use near_sdk::near; | ||
/// # #[near(contract_state)] | ||
/// # pub struct Contract { /* .. */ } | ||
/// #[near] | ||
/// impl Contract { | ||
/// pub fn method( | ||
/// &mut self, | ||
/// regular: String, | ||
/// #[callback_unwrap] one: String, | ||
/// #[callback_unwrap] two: String | ||
/// ) { /* .. */ } | ||
/// } | ||
/// ``` | ||
/// | ||
/// For above `method` using the attribute on arguments, changes the body of function generated in [`#[near]` on mutating method](near#for-above-mutating-method-near-macro-defines-the-following-function) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this pr depends on #1307, as the doc anchor is first added there. RUSTDOCFLAGS: -D warnings
run: |
cargo doc -p near-sdk --features unstable,legacy,unit-testing,__macro-docs,__abi-generate
dj8yfo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
/// | ||
/// ```rust,no_run | ||
/// #[no_mangle] | ||
/// pub extern "C" fn method() { /* .. */ } | ||
/// ``` | ||
/// | ||
/// in the following way: | ||
/// | ||
/// 1. arguments, annotated with `#[callback_unwrap]`, are no longer expected to be included into `input`, | ||
/// deserialized in (step **3**, [`#[near]` on mutating method](near#for-above-mutating-method-near-macro-defines-the-following-function)). | ||
/// 2. for each argument, annotated with `#[callback_unwrap]`: | ||
/// 1. [`env::promise_result`] host function is called with corresponding index, starting from 0 | ||
/// (`0u64` for argument `one`, `1u64` for argument `two` above), and saved into `promise_result` variable | ||
/// 2. if the `promise_result` is a [`PromiseResult::Failed`] error, then [`env::panic_str`] host function is called to signal callback computation error | ||
/// 3. otherwise, if the `promise_result` is a [`PromiseResult::Successful`], it's unwrapped and saved to a `data` variable | ||
/// 4. `data` is deserialized similar to that as usual (step **3**, [`#[near]` on mutating method](near#for-above-mutating-method-near-macro-defines-the-following-function)), | ||
/// and saved to `deserialized_n_promise` variable | ||
/// 3. counterpart of (step **7**, [`#[near]` on mutating method](near#for-above-mutating-method-near-macro-defines-the-following-function)): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would make it more compact:
2.2
2.3 can be removed 2.4 otherwise, promise_result is deserialized ... But your variant is also lgtm |
||
/// original method is called `Contract::method(&mut state, deserialized_input_success.regular, deserialized_0_promise, deserialized_1_promise)`, | ||
/// as defined in `#[near]` annotated impl block | ||
/// | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this section is roughly based on the following expansion diff: 142c142
< pub fn factorial_mult(self, n: u32, cur: u32) -> ::near_sdk::Promise {
---
> pub fn factorial_mult(self, n: u32) -> ::near_sdk::Promise {
147d146
< cur: &'nearinput u32,
165c164
< false as usize + 1 + 1,
---
> false as usize + 1,
172,176d170
< _serde::ser::SerializeStruct::serialize_field(
< &mut __serde_state,
< "cur",
< &self.cur,
< )?;
181c175
< let __args = Input { n: &n, cur: &cur };
---
> let __args = Input { n: &n };
459d452
< cur: u32,
477d469
< __field1,
503d494
< 1u64 => _serde::__private::Ok(__Field::__field1),
516d506
< "cur" => _serde::__private::Ok(__Field::__field1),
529d518
< b"cur" => _serde::__private::Ok(__Field::__field1),
582,595c571
< &"struct Input with 2 elements",
< ),
< );
< }
< };
< let __field1 = match _serde::de::SeqAccess::next_element::<
< u32,
< >(&mut __seq)? {
< _serde::__private::Some(__value) => __value,
< _serde::__private::None => {
< return _serde::__private::Err(
< _serde::de::Error::invalid_length(
< 1usize,
< &"struct Input with 2 elements",
---
> &"struct Input with 1 element",
600,603c576
< _serde::__private::Ok(Input {
< n: __field0,
< cur: __field1,
< })
---
> _serde::__private::Ok(Input { n: __field0 })
614d586
< let mut __field1: _serde::__private::Option<u32> = _serde::__private::None;
629,638d600
< __Field::__field1 => {
< if _serde::__private::Option::is_some(&__field1) {
< return _serde::__private::Err(
< <__A::Error as _serde::de::Error>::duplicate_field("cur"),
< );
< }
< __field1 = _serde::__private::Some(
< _serde::de::MapAccess::next_value::<u32>(&mut __map)?,
< );
< }
652,661c614
< let __field1 = match __field1 {
< _serde::__private::Some(__field1) => __field1,
< _serde::__private::None => {
< _serde::__private::de::missing_field("cur")?
< }
< };
< _serde::__private::Ok(Input {
< n: __field0,
< cur: __field1,
< })
---
> _serde::__private::Ok(Input { n: __field0 })
665c618
< const FIELDS: &'static [&'static str] = &["n", "cur"];
---
> const FIELDS: &'static [&'static str] = &["n"];
678c631
< let Input { n, cur }: Input = match ::near_sdk::env::input() {
---
> let Input { n }: Input = match ::near_sdk::env::input() {
687a641,648
> };
> let data: ::std::vec::Vec<u8> = match ::near_sdk::env::promise_result(0u64) {
> ::near_sdk::PromiseResult::Successful(x) => x,
> _ => ::near_sdk::env::panic_str("Callback computation 0 was not successful"),
> };
> let cur: u32 = match ::near_sdk::serde_json::from_slice(&data) {
> Ok(deserialized) => deserialized,
> Err(_) => ::near_sdk::env::panic_str("Failed to deserialize callback using JSON"), |
||
/// ## `#[near(event_json(...))]` (annotates enums) | ||
/// | ||
/// By passing `event_json` as an argument `near` will generate the relevant code to format events | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
#[callback_vec]
isn't really compatible with#[callback_unwrap]
to be used in this manner, due to a feature??/bug??, because it revisits the same promise indices, already visited bycallback_unwrap
,so
others
vector in this example containeda
andb
as first elementsThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
created #1320 to describe with an example + assertion of current behaviour, because it looks like it's not obvious to get it with
cargo expand
example