From c108eb7b47507cede588557b4daf750e967eed64 Mon Sep 17 00:00:00 2001 From: austinabell Date: Mon, 28 Mar 2022 18:49:42 -0400 Subject: [PATCH 1/6] refactor!: move macro generated types to pseudo-private module --- .../src/core_impl/metadata/metadata_generator.rs | 4 ++-- .../src/core_impl/metadata/metadata_visitor.rs | 10 +++++----- near-sdk-macros/src/lib.rs | 2 +- near-sdk/src/lib.rs | 8 +++++--- near-sdk/src/{ => private}/metadata.rs | 0 near-sdk/src/private/mod.rs | 4 ++++ 6 files changed, 17 insertions(+), 11 deletions(-) rename near-sdk/src/{ => private}/metadata.rs (100%) create mode 100644 near-sdk/src/private/mod.rs diff --git a/near-sdk-macros/src/core_impl/metadata/metadata_generator.rs b/near-sdk-macros/src/core_impl/metadata/metadata_generator.rs index 0c1ffac42..f32b4d971 100644 --- a/near-sdk-macros/src/core_impl/metadata/metadata_generator.rs +++ b/near-sdk-macros/src/core_impl/metadata/metadata_generator.rs @@ -14,7 +14,7 @@ impl ImplItemMethodInfo { /// ``` /// will produce this struct: /// ```ignore - /// near_sdk::MethodMetadata { + /// near_sdk::__private::MethodMetadata { /// name: "f3".to_string(), /// is_view: false, /// is_init: false, @@ -108,7 +108,7 @@ impl ImplItemMethodInfo { }; quote! { - near_sdk::MethodMetadata { + near_sdk::__private::MethodMetadata { name: #method_name_str.to_string(), is_view: #is_view, is_init: #is_init, diff --git a/near-sdk-macros/src/core_impl/metadata/metadata_visitor.rs b/near-sdk-macros/src/core_impl/metadata/metadata_visitor.rs index 57d578372..80c1e4455 100644 --- a/near-sdk-macros/src/core_impl/metadata/metadata_visitor.rs +++ b/near-sdk-macros/src/core_impl/metadata/metadata_visitor.rs @@ -57,7 +57,7 @@ impl MetadataVisitor { pub extern "C" fn metadata() { #panic_hook use borsh::*; - let metadata = near_sdk::Metadata::new(vec![ + let metadata = near_sdk::__private::Metadata::new(vec![ #(#methods),* ]); let data = near_sdk::borsh::BorshSerialize::try_to_vec(&metadata).expect("Failed to serialize the metadata using Borsh"); @@ -100,8 +100,8 @@ mod tests { pub extern "C" fn metadata() { near_sdk::env::setup_panic_hook(); use borsh::*; - let metadata = near_sdk::Metadata::new(vec![ - near_sdk::MethodMetadata { + let metadata = near_sdk::__private::Metadata::new(vec![ + near_sdk::__private::MethodMetadata { name: "f1".to_string(), is_view: true, is_init: false, @@ -110,7 +110,7 @@ mod tests { callbacks_vec: None, result: None }, - near_sdk::MethodMetadata { + near_sdk::__private::MethodMetadata { name: "f2".to_string(), is_view: false, is_init: false, @@ -129,7 +129,7 @@ mod tests { callbacks_vec: None, result: None }, - near_sdk::MethodMetadata { + near_sdk::__private::MethodMetadata { name: "f3".to_string(), is_view: false, is_init: false, diff --git a/near-sdk-macros/src/lib.rs b/near-sdk-macros/src/lib.rs index b0c215949..2f257e343 100644 --- a/near-sdk-macros/src/lib.rs +++ b/near-sdk-macros/src/lib.rs @@ -181,7 +181,7 @@ pub fn borsh_storage_key(item: TokenStream) -> TokenStream { ); }; TokenStream::from(quote! { - impl near_sdk::BorshIntoStorageKey for #name {} + impl near_sdk::__private::BorshIntoStorageKey for #name {} }) } diff --git a/near-sdk/src/lib.rs b/near-sdk/src/lib.rs index 7c10937c4..71f54ae7c 100644 --- a/near-sdk/src/lib.rs +++ b/near-sdk/src/lib.rs @@ -23,8 +23,10 @@ pub use near_sys as sys; mod promise; pub use promise::{Promise, PromiseOrValue}; -mod metadata; -pub use metadata::{Metadata, MethodMetadata}; +// Private types just used within macro generation, not stable to be used. +#[doc(hidden)] +#[path = "private/mod.rs"] +pub mod __private; pub mod json_types; @@ -42,7 +44,7 @@ pub use near_vm_logic::VMConfig; pub use near_vm_logic::VMContext; pub mod utils; -pub use crate::utils::storage_key_impl::*; +pub use crate::utils::storage_key_impl::IntoStorageKey; pub use crate::utils::*; #[cfg(not(target_arch = "wasm32"))] diff --git a/near-sdk/src/metadata.rs b/near-sdk/src/private/metadata.rs similarity index 100% rename from near-sdk/src/metadata.rs rename to near-sdk/src/private/metadata.rs diff --git a/near-sdk/src/private/mod.rs b/near-sdk/src/private/mod.rs new file mode 100644 index 000000000..fde5eceaa --- /dev/null +++ b/near-sdk/src/private/mod.rs @@ -0,0 +1,4 @@ +mod metadata; +pub use metadata::{Metadata, MethodMetadata}; + +pub use crate::utils::storage_key_impl::BorshIntoStorageKey; \ No newline at end of file From 73f9f4372a09f230faa8ef5bf284a84c76032a24 Mon Sep 17 00:00:00 2001 From: austinabell Date: Mon, 28 Mar 2022 18:55:31 -0400 Subject: [PATCH 2/6] rebuild --- .../res/non_fungible_token.wasm | Bin 247269 -> 247269 bytes near-sdk/src/private/mod.rs | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/non-fungible-token/res/non_fungible_token.wasm b/examples/non-fungible-token/res/non_fungible_token.wasm index f9d777f032ad114b9803aff84b68ee1b521ffbfa..9fc4eb92c6b40ca2ca1ee83a434a2f3605e13e9e 100755 GIT binary patch delta 698 zcmZutUr1A76u;-5&5haEpd0khrmc~dlubLaMyANK z>w@q=a|YkSg#INM#_j2W7pmkQRaI4z%Gu;Cs@TR#V0BS8RVWNC#C9la404*vy4D)> z>h`9qCt+T{anA@rUT>fAAQ)PI<`c#9vme3G56r1R^yIt4O1p+VIk-3z5zWSS%+jwCn7jn+oK`tP5-b z7!-?PX!XiV{X7tZ23Qf-VsNV7mmV~)+~)q(vwHQs`3KBhDX~}9C|fC1QzHKenyMi! z4t;Z>N&y1tLs?_eFR?uu0Wu27Q6lC=Y+zZV-n!qe5 i{B)8kg%2cgHw^KoNsJI}PNAQVv|%;m#N`ymD*gfE3HPc1 delta 702 zcmZutUr1A76u;-5&5haEpcRX*h%WfYCd$vz{P%^rfNAgE{(vIj?Kg#~d(v$XY4 zUG1YFScKbx9;8cr;*&uS6%~QNYm2g(N};PE*6dngP*xQ-u+m^y zvvyuS4h8Mn{qG@I(t5vn5Oj4o|B2$6xsRZ0yXO@kdam2d)SE7BrTC-p6%y*}g+a;> z6oV8K#UT>eeg+L~_*Y5>oge9vn>2fA97wDEIZdk7i;rn67Skr$b?Wa87c7Z62UyzS zwpa*5w^vS#@b(yVKuKJQ!HIpo$y>&i8=b%7%U2hSKVZ&AiM=vMnUXZB8Bu-$om*g1 z?Ee63E`cs+^B@^992CV=Sl&BUwWHcg^=M)`_vYj_>K)C=A<{q0$?LpTJx`nQ4dv(S z@G~TMw*|>Le`>+NGHu{>RyJ&u|yWLCqJ7~70lfUM|f!FRGRUb(^d-wnv# zOSK!ad}k}Jr*AmiiY`C6#n}kXn;;|(^`d7xjEd+z>^Bk5KERi@pd?9m2&O9T60=Ao zcA;;etA}!xU_2ni3GRbVseyQiu*<0V>^S Date: Tue, 12 Apr 2022 16:13:49 -0400 Subject: [PATCH 3/6] re-org --- .../fungible-token/res/fungible_token.wasm | Bin 214959 -> 214943 bytes .../res/non_fungible_token.wasm | Bin 251729 -> 251729 bytes near-sdk/src/private/mod.rs | 34 +++++++++++++++++- near-sdk/src/utils/storage_key_impl.rs | 31 ---------------- 4 files changed, 33 insertions(+), 32 deletions(-) diff --git a/examples/fungible-token/res/fungible_token.wasm b/examples/fungible-token/res/fungible_token.wasm index cf48961fcfacd7eb06c08fd5ddec3f0c0f008660..6a8bc3cc3252688ea9820712fb4133a0a63d2446 100755 GIT binary patch delta 18730 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 HK3@L=Wo!8+ delta 18790 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 bpiB+?1fHcgYsARjN?YbNMqSif@$vdU!ny|c diff --git a/examples/non-fungible-token/res/non_fungible_token.wasm b/examples/non-fungible-token/res/non_fungible_token.wasm index 21995530864b3e5b79e12c8df8b0928c07177986..4f28ac31555f07464c1c73a36bb7e995e7cefe06 100755 GIT binary patch delta 8551 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%0DX4VbA`h)oS-Nods0 zyV5UzzWW{6I*1m@cZ17>-f(`>L^C7(Qoo#*o9G?9-R(2ej(A7CYo@20E_oetl^R`T zOx+EB^eZ^ZKli5_@aj9gIkkyG3+-q5%XMS2(!PJS%34B=IAEnyq#5`$^n>#g!P6sY zs=GcelHPT`>sfhT6fH%qI!DtzNWK+KccZQUilL(@PD?^_I@GC3rt1xtC|e8B!}=R8 z|F${J$Z@~zHsRdwUNzk>P~NgKThKVaZ}r*qld~x%x1c5N zyL~7AcNLv?jxSJYXVkV##iVkMUsCDvCRcXLRc05+k%;3YeXZ)!!m`8CSZ z154y>RchmriS!w05U(WCbU>~TTGJ7*gp(w?1B&>rBw9-vuJPhFbO@ef{%AvwLsju% z+#7BBA`Ha+^XP3Ut+UtudH;^OczG(#gT2C@N-4luQP`F)Bk0Vi_Ot*$E8EjWs6&d4 z&c`S7Vn+uWic7e(7yTIjDb1hDrlVt=!$qJA<=Ghz#3=-qJvvik{knB5 z@j@9!2P8s>82%b{r11g8^r?UoT@^!1gTZj4EB~aJb_`4DrWn$&jVBd+UN9I^_;1B@ z9r?Z+*EZ5d+%}eNqV2*;A6D>~Y%u&6{w(+_?s-pTDu%Y$d>ovxyFD1&S%|ya zqyE(HgKeu9y&W+a!oAuV*zV!g?uhN4UhP-0KQkEeJOkLBfTvxJ?L@B*wb=F+a1+~| zyy!+8z?7^KguwBU?`<(W{r^v;h(@${3%o5rOuc_lpXn*|dD4}>x U=X18uVJ2iY7(~?;Iz8!s0aIp*6aWAK delta 8464 zcmb_hd03QH+n@WKnSo(_V31vX5E0x40aH^+4;EUcnPv9Yo6DP9WMV36W-=(1;*$E5 z=XEQ}1-A?u?J?8BKHm4zPz1MJQpprSF$Z(2P`>*-voMo+UEd$y#Wm+S=XdUNZ|6Su zS*Y3`T(v#8c&I^n){tbIWyqp%#CFLS2&u|bKHV`;N%QXpRm$q>fwrCg_X!+Tb_8W( z*)~{|A8Msu67^|Pw&`e|)vAkwfB6?lLrFm%aHN1^5w36V2}=SFL)gD#0zjpb(kVT+Qb^GGGr&LVXQfu1paDqn29a*Lj0H?EA&GA znLjJ`LIPL-EA>JGSs<(QLV{Qjt9Bx}4)MV(nAyFEBqp(?>pc|;VIi#03khYRtk?@N zGczmoLc&-WtMo!zuokS^h2(0^4`<=b?t(NVf<-Xv22b&kERq#^AyF)f6?-AkESi;i zAu%k5ReB+@ES6QfkvK8;E%DFph6K_I|EwD|@ybHWV2sJrmSl`czvK#xn^VbCpwjkq z7bCQE28#?b$&%s8z#v)A_Up1_f7v8mP_k1x!&zl*$_wr=(=i>h7J1qw0&nR9NTC-Z zLb3P(q|_6U17!>yI+G1wk16}nBcJOYnEz&DqDT#5Wt+3KHw}iVxC+M zm>{-4C0zK+;^BLpgJ0nbt+oU%#7Pa5Hn zt?rdpzR1vb+(m+-u1%<+El&wcBuBy_+N5Bz=^-*sU+Ij^KG6(tNYPK~2`7|3lM+Hs z2=V~pFQ$?uWwAZBoJl7Qa99~UZ8j==euhQ)eOf5iAS0RTnGiD)jeulv1nW7x6l}mCgO65$!>2Qw4yb0p;0TKR~KMbt?U56i} z=@w<^TY}K7N_ zhV{YXcmhA#Y#-eACswke4GmXX-@l@4UL6;jXGhaykbbgSt-4@;X0_XXS{*|%cl$gk^!c468nl%6i$r_UGXsW|S(F(Vs-7xx0Ox-AA-;U&-C!=j_<5b(nD6 zwojs)9RV>~3~P$pPVx@&mgf;G8Z0=Lvea zq+Gl764WRIY6gXe+?B%gdSnbH+y zeQhtqt82$1o>@1rs z#^@xC*55@u`+72vAej%gHZGbWzxM4a6?&nZ<1na z`lqSsKE@Xl>vvL9PdH%P-1H{E0UiS|I^=*hNtD@jS#6ArN(a=%0DlrV!x!k`037De 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 diff --git a/near-sdk/src/private/mod.rs b/near-sdk/src/private/mod.rs index a948ab5bd..122adf710 100644 --- a/near-sdk/src/private/mod.rs +++ b/near-sdk/src/private/mod.rs @@ -1,4 +1,36 @@ mod metadata; + pub use metadata::{Metadata, MethodMetadata}; -pub use crate::utils::storage_key_impl::BorshIntoStorageKey; +use crate::IntoStorageKey; +use borsh::BorshSerialize; + +/// Converts a Borsh serializable object into a `Vec` that is used for a storage key. +/// +/// [`BorshStorageKey`](crate::BorshStorageKey) should be used instead of implementing +/// this manually. +/// +/// ``` +/// use near_sdk::borsh::BorshSerialize; +/// use near_sdk::BorshStorageKey; +/// use near_sdk::collections::LookupMap; +/// +/// #[derive(BorshSerialize, BorshStorageKey)] +/// enum StorageKey { +/// FungibleToken, +/// Metadata { sub_key: String }, +/// } +/// +/// let lookup_map_1: LookupMap = LookupMap::new(StorageKey::Metadata { sub_key: String::from("yo") }); +/// let lookup_map_2: LookupMap = LookupMap::new(StorageKey::FungibleToken); +/// ``` +pub trait BorshIntoStorageKey: BorshSerialize {} + +impl IntoStorageKey for T +where + T: BorshIntoStorageKey, +{ + fn into_storage_key(self) -> Vec { + self.try_to_vec().unwrap() + } +} diff --git a/near-sdk/src/utils/storage_key_impl.rs b/near-sdk/src/utils/storage_key_impl.rs index 7cd2201f1..843f3070f 100644 --- a/near-sdk/src/utils/storage_key_impl.rs +++ b/near-sdk/src/utils/storage_key_impl.rs @@ -1,5 +1,3 @@ -use borsh::BorshSerialize; - /// Converts Self into a [`Vec`] that is used for a storage key through [`into_storage_key`]. /// /// [`into_storage_key`]: IntoStorageKey::into_storage_key @@ -35,32 +33,3 @@ impl IntoStorageKey for u8 { vec![self] } } - -/// Converts a Borsh serializable object into a `Vec` that is used for a storage key. -/// -/// ``` -/// use near_sdk::borsh::BorshSerialize; -/// use near_sdk::BorshIntoStorageKey; -/// use near_sdk::collections::LookupMap; -/// -/// #[derive(BorshSerialize)] -/// enum StorageKey { -/// FungibleToken, -/// Metadata { sub_key: String }, -/// } -/// -/// impl BorshIntoStorageKey for StorageKey {} -/// -/// let lookup_map_1: LookupMap = LookupMap::new(StorageKey::Metadata { sub_key: String::from("yo") }); -/// let lookup_map_2: LookupMap = LookupMap::new(StorageKey::FungibleToken); -/// ``` -pub trait BorshIntoStorageKey: BorshSerialize {} - -impl IntoStorageKey for T -where - T: BorshIntoStorageKey, -{ - fn into_storage_key(self) -> Vec { - self.try_to_vec().unwrap() - } -} From a0747d37cd14992f3d1a0d6e51735a651ff497c8 Mon Sep 17 00:00:00 2001 From: austinabell Date: Wed, 13 Apr 2022 10:22:09 -0400 Subject: [PATCH 4/6] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0cb03df1..4959e2b02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ - Fixed gas assertion in `*_transfer_call` implementations of FT and NFT standards to only require what's needed. [PR 760](https://github.com/near/near-sdk-rs/pull/760) - Fixed events being emitted in FT standard to include refund transfers and burn events. [PR 752](https://github.com/near/near-sdk-rs/pull/752) - Moved `VMContext` to a local type defined in SDK to avoid duplicate types. [PR 785](https://github.com/near/near-sdk-rs/pull/785) +- Moved `Metadata` and `MethodMetadata` to a pseudo-private module as these are just types used within macros and not stable. [PR 771](https://github.com/near/near-sdk-rs/pull/771) ### Removed - Remove `Clone` implementation for `Promise` (error prone) https://github.com/near/near-sdk-rs/pull/783 From 342e964f6b9f834bd15cd880f27291ed3ce7556a Mon Sep 17 00:00:00 2001 From: austinabell Date: Thu, 14 Apr 2022 10:28:56 -0400 Subject: [PATCH 5/6] merge --- .../fungible-token/res/fungible_token.wasm | Bin 214943 -> 214943 bytes .../res/non_fungible_token.wasm | Bin 251729 -> 251729 bytes .../res/status_message_collections.wasm | Bin 95012 -> 95012 bytes near-sdk/src/collections/lazy_option.rs | 63 ++++++ near-sdk/src/collections/lookup_map.rs | 70 +++++++ near-sdk/src/collections/lookup_set.rs | 41 ++++ near-sdk/src/collections/tree_map.rs | 180 +++++++++++++++++ near-sdk/src/collections/unordered_map.rs | 65 +++++++ near-sdk/src/collections/unordered_set.rs | 65 +++++++ near-sdk/src/collections/vector.rs | 7 + near-sdk/src/store/lookup_map/mod.rs | 79 ++++++++ near-sdk/src/store/unordered_map/mod.rs | 104 ++++++++++ near-sdk/src/store/vec/mod.rs | 183 ++++++++++++++++++ 13 files changed, 857 insertions(+) diff --git a/examples/fungible-token/res/fungible_token.wasm b/examples/fungible-token/res/fungible_token.wasm index 6a8bc3cc3252688ea9820712fb4133a0a63d2446..7294bd9c69414aa2186ca8c3492b18c5c68cf4c3 100755 GIT binary patch delta 37 qcmbQ=&pW@Lx1oh`3lsMnK|2Np23;Tykq}_e0n(n^W!^9~M*{%BvI#W+ delta 37 qcmbQ=&pW@Lx1oh`3lsMnL30KM23;Tykq}_e0n$#}W!^9~M*{%A;0Y%H diff --git a/examples/non-fungible-token/res/non_fungible_token.wasm b/examples/non-fungible-token/res/non_fungible_token.wasm index 4f28ac31555f07464c1c73a36bb7e995e7cefe06..7ab18f665e0c441442ca4e3e4c84719ed0adb017 100755 GIT binary patch delta 342 zcmcb(j{o91{)QID7N#xCE0+t}F)%Rb0lv6J!XZ`y3|c^8HXz>?NW=J&X#DSt3=G0Z^7n!A zLP-3lK)wwU{~3@Eav#h*T_E2P!LMg9K^0(_0pu$q6fn#|GhhvnZ;T|r15N!NH1%iD c)H?zBpg_{k$S*F@pU%FLnRokxRm_Dt081Y-LI3~& delta 342 zcmcb(j{o91{)QID7N#xCE0+tJGcYjd01oCZ=_(nj!9TLA1sNWI6uV-jL6<~M* = LazyOption::new(b"l", Some(&42)); + /// let another_option: LazyOption = LazyOption::new(b"l", None); + /// ``` pub fn new(storage_key: S, value: Option<&T>) -> Self where S: IntoStorageKey, @@ -97,27 +106,81 @@ where /// Removes the value from storage without reading it. /// Returns whether the value was present. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LazyOption; + /// + /// let mut option: LazyOption = LazyOption::new(b"l", Some(&42)); + /// assert_eq!(option.remove(), true); + /// assert!(option.is_none()); + /// assert_eq!(option.remove(), false); + /// ``` pub fn remove(&mut self) -> bool { self.remove_raw() } /// Removes the value from storage and returns it as an option. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LazyOption; + /// + /// let mut option: LazyOption = LazyOption::new(b"l", Some(&42)); + /// assert_eq!(option.take(), Some(42)); + /// assert!(option.is_none()); + /// assert_eq!(option.take(), None); + /// ``` pub fn take(&mut self) -> Option { self.take_raw().map(|v| Self::deserialize_value(&v)) } /// Gets the value from storage and returns it as an option. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LazyOption; + /// + /// let mut option: LazyOption = LazyOption::new(b"l", None); + /// assert_eq!(option.get(), None); + /// option.set(&42); + /// assert_eq!(option.get(), Some(42)); + /// assert!(option.is_some()); + /// ``` pub fn get(&self) -> Option { self.get_raw().map(|v| Self::deserialize_value(&v)) } /// Sets the value into the storage without reading the previous value and returns whether the /// previous value was present. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LazyOption; + /// + /// let mut option: LazyOption = LazyOption::new(b"l", None); + /// assert_eq!(option.set(&42), false); + /// assert_eq!(option.set(&420), true); + /// ``` pub fn set(&mut self, value: &T) -> bool { self.set_raw(&Self::serialize_value(value)) } /// Replaces the value in the storage and returns the previous value as an option. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LazyOption; + /// + /// let mut option: LazyOption = LazyOption::new(b"l", None); + /// assert_eq!(option.replace(&42), None); + /// assert_eq!(option.replace(&420), Some(42)); + /// ``` pub fn replace(&mut self, value: &T) -> Option { self.replace_raw(&Self::serialize_value(value)).map(|v| Self::deserialize_value(&v)) } diff --git a/near-sdk/src/collections/lookup_map.rs b/near-sdk/src/collections/lookup_map.rs index d61ab3460..77d51d5ac 100644 --- a/near-sdk/src/collections/lookup_map.rs +++ b/near-sdk/src/collections/lookup_map.rs @@ -22,6 +22,13 @@ pub struct LookupMap { impl LookupMap { /// Create a new map. Use `key_prefix` as a unique prefix for keys. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LookupMap; + /// let mut map: LookupMap = LookupMap::new(b"m"); + /// ``` pub fn new(key_prefix: S) -> Self where S: IntoStorageKey, @@ -97,17 +104,53 @@ where } /// Returns true if the map contains a given key. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LookupMap; + /// + /// let mut map: LookupMap = LookupMap::new(b"m"); + /// assert_eq!(map.contains_key(&"Toyota".into()), false); + /// + /// map.insert(&"Toyota".into(), &"Camry".into()); + /// assert_eq!(map.contains_key(&"Toyota".into()), true); + /// ``` pub fn contains_key(&self, key: &K) -> bool { self.contains_key_raw(&Self::serialize_key(key)) } /// Returns the value corresponding to the key. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LookupMap; + /// + /// let mut map: LookupMap = LookupMap::new(b"m"); + /// assert_eq!(map.get(&"Toyota".into()), None); + /// + /// map.insert(&"Toyota".into(), &"Camry".into()); + /// assert_eq!(map.get(&"Toyota".into()), Some("Camry".into())); + /// ``` pub fn get(&self, key: &K) -> Option { self.get_raw(&Self::serialize_key(key)).map(|value_raw| Self::deserialize_value(&value_raw)) } /// Removes a key from the map, returning the value at the key if the key was previously in the /// map. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LookupMap; + /// + /// let mut map: LookupMap = LookupMap::new(b"m"); + /// assert_eq!(map.remove(&"Toyota".into()), None); + /// + /// map.insert(&"Toyota".into(), &"Camry".into()); + /// assert_eq!(map.remove(&"Toyota".into()), Some("Camry".into())); + /// ``` pub fn remove(&mut self, key: &K) -> Option { self.remove_raw(&Self::serialize_key(key)) .map(|value_raw| Self::deserialize_value(&value_raw)) @@ -117,11 +160,38 @@ where /// If the map did not have this key present, `None` is returned. Otherwise returns /// a value. Note, the keys that have the same hash value are undistinguished by /// the implementation. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LookupMap; + /// + /// let mut map: LookupMap = LookupMap::new(b"m"); + /// assert_eq!(map.insert(&"Toyota".into(), &"Camry".into()), None); + /// assert_eq!(map.insert(&"Toyota".into(), &"Corolla".into()), Some("Camry".into())); + /// ``` pub fn insert(&mut self, key: &K, value: &V) -> Option { self.insert_raw(&Self::serialize_key(key), &Self::serialize_value(value)) .map(|value_raw| Self::deserialize_value(&value_raw)) } + /// Inserts all new key-values from the iterator and replaces values with existing keys + /// with new values returned from the iterator. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LookupMap; + /// + /// let mut extendee: LookupMap = LookupMap::new(b"m"); + /// let mut source = vec![]; + /// + /// source.push(("Toyota".into(), "Camry".into())); + /// source.push(("Nissan".into(), "Almera".into())); + /// source.push(("Ford".into(), "Mustang".into())); + /// source.push(("Chevrolet".into(), "Camaro".into())); + /// extendee.extend(source.into_iter()); + /// ``` pub fn extend>(&mut self, iter: IT) { for (el_key, el_value) in iter { self.insert(&el_key, &el_value); diff --git a/near-sdk/src/collections/lookup_set.rs b/near-sdk/src/collections/lookup_set.rs index 5ce321b51..83f4538dc 100644 --- a/near-sdk/src/collections/lookup_set.rs +++ b/near-sdk/src/collections/lookup_set.rs @@ -20,6 +20,13 @@ pub struct LookupSet { impl LookupSet { /// Create a new map. Use `element_prefix` as a unique prefix for trie keys. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LookupSet; + /// let mut set: LookupSet = LookupSet::new(b"s"); + /// ``` pub fn new(element_prefix: S) -> Self where S: IntoStorageKey, @@ -65,11 +72,35 @@ where } /// Returns true if the set contains an element. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LookupSet; + /// + /// let mut set: LookupSet = LookupSet::new(b"s"); + /// assert_eq!(set.contains(&"Element".into()), false); + /// + /// set.insert(&"Element".into()); + /// assert_eq!(set.contains(&"Element".into()), true); + /// ``` pub fn contains(&self, element: &T) -> bool { self.contains_raw(&Self::serialize_element(element)) } /// Removes a value from the set. Returns whether the value was present in the set. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LookupSet; + /// + /// let mut set: LookupSet = LookupSet::new(b"s"); + /// assert_eq!(set.remove(&"Element".into()), false); + /// + /// set.insert(&"Element".into()); + /// assert_eq!(set.remove(&"Element".into()), true); + /// ``` pub fn remove(&mut self, element: &T) -> bool { self.remove_raw(&Self::serialize_element(element)) } @@ -77,6 +108,16 @@ where /// Adds a value to the set. /// If the set did not have this value present, `true` is returned. /// If the set did have this value present, `false` is returned. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::LookupSet; + /// + /// let mut set: LookupSet = LookupSet::new(b"s"); + /// assert_eq!(set.insert(&"Element".into()), true); + /// assert_eq!(set.insert(&"Element".into()), false); + /// ``` pub fn insert(&mut self, element: &T) -> bool { self.insert_raw(&Self::serialize_element(element)) } diff --git a/near-sdk/src/collections/tree_map.rs b/near-sdk/src/collections/tree_map.rs index ef2acc68e..275a1aee5 100644 --- a/near-sdk/src/collections/tree_map.rs +++ b/near-sdk/src/collections/tree_map.rs @@ -44,6 +44,14 @@ where K: Ord + Clone + BorshSerialize + BorshDeserialize, V: BorshSerialize + BorshDeserialize, { + /// Makes a new, empty TreeMap + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// let mut tree: TreeMap = TreeMap::new(b"t"); + /// ``` pub fn new(prefix: S) -> Self where S: IntoStorageKey, @@ -56,6 +64,18 @@ where } } + /// Returns the number of elements in the tree, also referred to as its size. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// + /// let mut tree: TreeMap = TreeMap::new(b"t"); + /// tree.insert(&1, &10); + /// tree.insert(&2, &20); + /// assert_eq!(tree.len(), 2); + /// ``` pub fn len(&self) -> u64 { self.tree.len() } @@ -64,6 +84,19 @@ where self.tree.is_empty() } + /// Clears the tree, removing all elements. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// + /// let mut tree: TreeMap = TreeMap::new(b"t"); + /// tree.insert(&1, &10); + /// tree.insert(&2, &20); + /// tree.clear(); + /// assert_eq!(tree.len(), 0); + /// ``` pub fn clear(&mut self) { self.root = 0; for n in self.tree.iter() { @@ -84,14 +117,53 @@ where } } + /// Returns true if the map contains a given key. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// + /// let mut tree: TreeMap = TreeMap::new(b"t"); + /// assert_eq!(tree.contains_key(&1), false); + /// tree.insert(&1, &10); + /// assert_eq!(tree.contains_key(&1), true); + /// ``` pub fn contains_key(&self, key: &K) -> bool { self.val.get(key).is_some() } + /// Returns the value corresponding to the key. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// + /// let mut tree: TreeMap = TreeMap::new(b"t"); + /// assert_eq!(tree.get(&1), None); + /// tree.insert(&1, &10); + /// assert_eq!(tree.get(&1), Some(10)); + /// ``` pub fn get(&self, key: &K) -> Option { self.val.get(key) } + /// Inserts a key-value pair into the tree. + /// If the tree did not have this key present, `None` is returned. Otherwise returns + /// a value. Note, the keys that have the same hash value are undistinguished by + /// the implementation. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// + /// let mut tree: TreeMap = TreeMap::new(b"t"); + /// assert_eq!(tree.insert(&1, &10), None); + /// assert_eq!(tree.insert(&1, &20), Some(10)); + /// assert_eq!(tree.contains_key(&1), true); + /// ``` pub fn insert(&mut self, key: &K, val: &V) -> Option { if !self.contains_key(key) { self.root = self.insert_at(self.root, self.len(), key); @@ -99,6 +171,20 @@ where self.val.insert(key, val) } + /// Removes a key from the tree, returning the value at the key if the key was previously in the + /// tree. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// + /// let mut tree: TreeMap = TreeMap::new(b"t"); + /// assert_eq!(tree.remove(&1), None); + /// tree.insert(&1, &10); + /// assert_eq!(tree.remove(&1), Some(10)); + /// assert_eq!(tree.contains_key(&1), false); + /// ``` pub fn remove(&mut self, key: &K) -> Option { if self.contains_key(key) { self.root = self.do_remove(key); @@ -130,6 +216,27 @@ where } /// Returns the smallest key that is greater or equal to key given as the parameter + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// + /// let mut map: TreeMap = TreeMap::new(b"t"); + /// let vec: Vec = vec![10, 20, 30, 40, 50]; + /// + /// for x in vec.iter() { + /// map.insert(x, &1); + /// } + /// + /// assert_eq!(map.ceil_key(&5), Some(10)); + /// assert_eq!(map.ceil_key(&10), Some(10)); + /// assert_eq!(map.ceil_key(&11), Some(20)); + /// assert_eq!(map.ceil_key(&20), Some(20)); + /// assert_eq!(map.ceil_key(&49), Some(50)); + /// assert_eq!(map.ceil_key(&50), Some(50)); + /// assert_eq!(map.ceil_key(&51), None); + /// ``` pub fn ceil_key(&self, key: &K) -> Option { if self.contains_key(key) { Some(key.clone()) @@ -139,6 +246,26 @@ where } /// Returns the largest key that is less or equal to key given as the parameter + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// + /// let mut map: TreeMap = TreeMap::new(b"t"); + /// let vec: Vec = vec![10, 20, 30, 40, 50]; + /// for x in vec.iter() { + /// map.insert(x, &1); + /// } + /// + /// assert_eq!(map.floor_key(&5), None); + /// assert_eq!(map.floor_key(&10), Some(10)); + /// assert_eq!(map.floor_key(&11), Some(10)); + /// assert_eq!(map.floor_key(&20), Some(20)); + /// assert_eq!(map.floor_key(&49), Some(40)); + /// assert_eq!(map.floor_key(&50), Some(50)); + /// assert_eq!(map.floor_key(&51), Some(50)); + /// ``` pub fn floor_key(&self, key: &K) -> Option { if self.contains_key(key) { Some(key.clone()) @@ -153,6 +280,22 @@ where } /// Iterate entries in ascending order: given key (exclusive) to max (inclusive) + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// + /// let mut map: TreeMap = TreeMap::new(b"t"); + /// let one: Vec = vec![10, 20, 30, 40, 50,45, 35, 25, 15, 5]; + /// for x in &one { + /// map.insert(x, &42); + /// } + /// assert_eq!( + /// map.iter_from(29).collect::>(), + /// vec![(30, 42), (35, 42), (40, 42), (45, 42), (50, 42)] + /// ) + /// ``` pub fn iter_from(&self, key: K) -> impl Iterator + '_ { Cursor::asc_from(self, key) } @@ -163,6 +306,22 @@ where } /// Iterate entries in descending order: given key (exclusive) to min (inclusive) + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// + /// let mut map: TreeMap = TreeMap::new(b"t"); + /// let one: Vec = vec![10, 20, 30, 40, 50,45, 35, 25, 15, 5]; + /// for x in &one { + /// map.insert(x, &42); + /// } + /// assert_eq!( + /// map.iter_rev_from(45).collect::>(), + /// vec![(40, 42), (35, 42), (30, 42), (25, 42), (20, 42), (15, 42), (10, 42), (5, 42)] + /// ); + /// ``` pub fn iter_rev_from(&self, key: K) -> impl Iterator + '_ { Cursor::desc_from(self, key) } @@ -173,6 +332,27 @@ where /// /// Panics if range start > end. /// Panics if range start == end and both bounds are Excluded. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::TreeMap; + /// use std::ops::Bound; + /// + /// let mut map: TreeMap = TreeMap::new(b"t"); + /// let one: Vec = vec![10, 20, 30, 40, 50]; + /// let two: Vec = vec![45, 35, 25, 15]; + /// for x in &one { + /// map.insert(x, &0); + /// } + /// for x in &two { + /// map.insert(x, &0); + /// } + /// assert_eq!( + /// map.range((Bound::Included(20), Bound::Excluded(30))).collect::>(), + /// vec![(20, 0), (25, 0)] + /// ); + /// ``` pub fn range(&self, r: (Bound, Bound)) -> impl Iterator + '_ { let (lo, hi) = match r { (Bound::Included(a), Bound::Included(b)) if a > b => env::panic_str("Invalid range."), diff --git a/near-sdk/src/collections/unordered_map.rs b/near-sdk/src/collections/unordered_map.rs index 9252b7279..64117535e 100644 --- a/near-sdk/src/collections/unordered_map.rs +++ b/near-sdk/src/collections/unordered_map.rs @@ -20,6 +20,18 @@ pub struct UnorderedMap { impl UnorderedMap { /// Returns the number of elements in the map, also referred to as its size. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"m"); + /// assert_eq!(map.len(), 0); + /// map.insert(&1, &1); + /// map.insert(&2, &2); + /// assert_eq!(map.len(), 2); + /// ``` pub fn len(&self) -> u64 { let keys_len = self.keys.len(); let values_len = self.values.len(); @@ -42,6 +54,13 @@ impl UnorderedMap { } /// Create new map with zero elements. Use `prefix` as a unique identifier. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedMap; + /// let mut map: UnorderedMap = UnorderedMap::new(b"m"); + /// ``` pub fn new(prefix: S) -> Self where S: IntoStorageKey, @@ -172,12 +191,35 @@ where } /// Returns the value corresponding to the key. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"m"); + /// assert_eq!(map.get(&1), None); + /// map.insert(&1, &10); + /// assert_eq!(map.get(&1), Some(10)); + /// ``` pub fn get(&self, key: &K) -> Option { self.get_raw(&Self::serialize_key(key)).map(|value_raw| Self::deserialize_value(&value_raw)) } /// Removes a key from the map, returning the value at the key if the key was previously in the /// map. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"m"); + /// assert_eq!(map.remove(&1), None); + /// map.insert(&1, &10); + /// assert_eq!(map.remove(&1), Some(10)); + /// assert_eq!(map.len(), 0); + /// ``` pub fn remove(&mut self, key: &K) -> Option { self.remove_raw(&Self::serialize_key(key)) .map(|value_raw| Self::deserialize_value(&value_raw)) @@ -187,12 +229,35 @@ where /// If the map did not have this key present, `None` is returned. Otherwise returns /// a value. Note, the keys that have the same hash value are undistinguished by /// the implementation. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"m"); + /// map.insert(&1, &10); + /// assert_eq!(map.get(&1), Some(10)); + /// assert_eq!(map.len(), 1); + /// ``` pub fn insert(&mut self, key: &K, value: &V) -> Option { self.insert_raw(&Self::serialize_key(key), &Self::serialize_value(value)) .map(|value_raw| Self::deserialize_value(&value_raw)) } /// Clears the map, removing all elements. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"m"); + /// map.insert(&1, &10); + /// map.insert(&2, &20); + /// map.clear(); + /// assert_eq!(map.len(), 0); + /// ``` pub fn clear(&mut self) { for raw_key in self.keys.iter_raw() { let index_lookup = self.raw_key_to_index_lookup(&raw_key); diff --git a/near-sdk/src/collections/unordered_set.rs b/near-sdk/src/collections/unordered_set.rs index 4197c6ed7..b9863aadc 100644 --- a/near-sdk/src/collections/unordered_set.rs +++ b/near-sdk/src/collections/unordered_set.rs @@ -17,6 +17,18 @@ pub struct UnorderedSet { impl UnorderedSet { /// Returns the number of elements in the set, also referred to as its size. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedSet; + /// + /// let mut set: UnorderedSet = UnorderedSet::new(b"s"); + /// assert_eq!(set.len(), 0); + /// set.insert(&1); + /// set.insert(&2); + /// assert_eq!(set.len(), 2); + /// ``` pub fn len(&self) -> u64 { self.elements.len() } @@ -27,6 +39,13 @@ impl UnorderedSet { } /// Create new map with zero elements. Use `id` as a unique identifier. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedSet; + /// let mut set: UnorderedSet = UnorderedSet::new(b"s"); + /// ``` pub fn new(prefix: S) -> Self where S: IntoStorageKey, @@ -123,11 +142,34 @@ where } /// Returns true if the set contains an element. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedSet; + /// + /// let mut set: UnorderedSet = UnorderedSet::new(b"s"); + /// assert_eq!(set.contains(&1), false); + /// set.insert(&1); + /// assert_eq!(set.contains(&1), true); + /// ``` pub fn contains(&self, element: &T) -> bool { self.contains_raw(&Self::serialize_element(element)) } /// Removes a value from the set. Returns whether the value was present in the set. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedSet; + /// + /// let mut set: UnorderedSet = UnorderedSet::new(b"s"); + /// assert_eq!(set.remove(&1), false); + /// set.insert(&1); + /// assert_eq!(set.remove(&1), true); + /// assert_eq!(set.contains(&1), false); + /// ``` pub fn remove(&mut self, element: &T) -> bool { self.remove_raw(&Self::serialize_element(element)) } @@ -135,11 +177,34 @@ where /// Adds a value to the set. /// If the set did not have this value present, `true` is returned. /// If the set did have this value present, `false` is returned. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedSet; + /// + /// let mut set: UnorderedSet = UnorderedSet::new(b"s"); + /// assert_eq!(set.insert(&1), true); + /// assert_eq!(set.insert(&1), false); + /// assert_eq!(set.contains(&1), true); + /// ``` pub fn insert(&mut self, element: &T) -> bool { self.insert_raw(&Self::serialize_element(element)) } /// Clears the map, removing all elements. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::UnorderedSet; + /// + /// let mut set: UnorderedSet = UnorderedSet::new(b"s"); + /// set.insert(&1); + /// set.insert(&2); + /// set.clear(); + /// assert_eq!(set.len(), 0); + /// ``` pub fn clear(&mut self) { for raw_element in self.elements.iter_raw() { let index_lookup = self.raw_element_to_index_lookup(&raw_element); diff --git a/near-sdk/src/collections/vector.rs b/near-sdk/src/collections/vector.rs index 3a5f645b9..d1dcc8078 100644 --- a/near-sdk/src/collections/vector.rs +++ b/near-sdk/src/collections/vector.rs @@ -40,6 +40,13 @@ impl Vector { } /// Create new vector with zero elements. Use `id` as a unique identifier on the trie. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::collections::Vector; + /// let mut set: Vector = Vector::new(b"m"); + /// ``` pub fn new(prefix: S) -> Self where S: IntoStorageKey, diff --git a/near-sdk/src/store/lookup_map/mod.rs b/near-sdk/src/store/lookup_map/mod.rs index 115b5ca7f..eef84003e 100644 --- a/near-sdk/src/store/lookup_map/mod.rs +++ b/near-sdk/src/store/lookup_map/mod.rs @@ -128,6 +128,15 @@ where K: BorshSerialize + Ord, V: BorshSerialize, { + /// Create a new map. Use `key_prefix` as a unique prefix for keys. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::LookupMap; + /// + /// let mut map: LookupMap = LookupMap::new(b"m"); + /// ``` #[inline] pub fn new(prefix: S) -> Self where @@ -164,6 +173,20 @@ where /// Use [`LookupMap::insert`] if you need the previous value. /// /// Calling `set` with a `None` value will delete the entry from storage. + /// + /// # Example + /// ``` + /// use near_sdk::store::LookupMap; + /// + /// let mut map = LookupMap::new(b"m"); + /// + /// map.set("test".to_string(), Some(7u8)); + /// assert!(map.contains_key("test")); + /// + /// //Delete the entry from storage + /// map.set("test".to_string(), None); + /// assert!(!map.contains_key("test")); + /// ``` pub fn set(&mut self, key: K, value: Option) { let entry = self.cache.get_mut(key); match entry.value.get_mut() { @@ -200,6 +223,17 @@ where /// The key may be any borrowed form of the map's key type, but /// [`BorshSerialize`] and [`ToOwned`](ToOwned) on the borrowed form *must* match those for /// the key type. + /// + /// # Example + /// ``` + /// use near_sdk::store::LookupMap; + /// + /// let mut map: LookupMap = LookupMap::new(b"m"); + /// + /// map.insert(1, "a".to_string()); + /// assert_eq!(map.get(&1), Some(&"a".to_string())); + /// assert_eq!(map.get(&2), None); + /// ``` pub fn get(&self, k: &Q) -> Option<&V> where K: Borrow, @@ -237,6 +271,18 @@ where /// The key may be any borrowed form of the map's key type, but /// [`BorshSerialize`] and [`ToOwned`](ToOwned) on the borrowed form *must* match those for /// the key type. + /// + /// # Example + /// ``` + /// use near_sdk::store::LookupMap; + /// + /// let mut map: LookupMap = LookupMap::new(b"m"); + /// map.insert(1, "a".to_string()); + /// if let Some(x) = map.get_mut(&1) { + /// *x = "b".to_string(); + /// assert_eq!(map[&1], "b".to_string()); + /// } + /// ``` pub fn get_mut(&mut self, k: &Q) -> Option<&mut V> where K: Borrow, @@ -252,6 +298,19 @@ where /// If the map did have this key present, the value is updated, and the old /// value is returned. The key is not updated, though; this matters for /// types that can be `==` without being identical. + /// + /// # Example + /// ``` + /// use near_sdk::store::LookupMap; + /// + /// let mut map: LookupMap = LookupMap::new(b"m"); + /// assert_eq!(map.insert(37, "a".to_string()), None); + /// assert_eq!(map.contains_key(&37), true); + /// + /// map.insert(37, "b".to_string()); + /// assert_eq!(map.insert(37, "c".to_string()), Some("b".to_string())); + /// assert_eq!(map[&37], "c".to_string()); + /// ``` pub fn insert(&mut self, k: K, v: V) -> Option where K: Clone, @@ -264,6 +323,16 @@ where /// The key may be any borrowed form of the map's key type, but /// [`BorshSerialize`] and [`ToOwned`](ToOwned) on the borrowed form *must* match those for /// the key type. + /// + /// # Example + /// ``` + /// use near_sdk::store::LookupMap; + /// + /// let mut map: LookupMap = LookupMap::new(b"m"); + /// map.insert(1, "a".to_string()); + /// assert_eq!(map.contains_key(&1), true); + /// assert_eq!(map.contains_key(&2), false); + /// ``` pub fn contains_key(&self, k: &Q) -> bool where K: Borrow, @@ -296,6 +365,16 @@ where /// The key may be any borrowed form of the map's key type, but /// [`BorshSerialize`] and [`ToOwned`](ToOwned) on the borrowed form *must* match those for /// the key type. + /// + /// # Example + /// ``` + /// use near_sdk::store::LookupMap; + /// + /// let mut map: LookupMap = LookupMap::new(b"m"); + /// map.insert(1, "a".to_string()); + /// assert_eq!(map.remove(&1), Some("a".to_string())); + /// assert_eq!(map.remove(&1), None); + /// ``` pub fn remove(&mut self, k: &Q) -> Option where K: Borrow, diff --git a/near-sdk/src/store/unordered_map/mod.rs b/near-sdk/src/store/unordered_map/mod.rs index e7ef63471..fd9c0996b 100644 --- a/near-sdk/src/store/unordered_map/mod.rs +++ b/near-sdk/src/store/unordered_map/mod.rs @@ -153,6 +153,15 @@ where K: BorshSerialize + Ord, V: BorshSerialize, { + /// Create a new map. Use `key_prefix` as a unique prefix for keys. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"b"); + /// ``` #[inline] pub fn new(prefix: S) -> Self where @@ -187,17 +196,51 @@ where } /// Return the amount of elements inside of the map. + /// + /// # Example + /// ``` + /// use near_sdk::store::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"b"); + /// assert_eq!(map.len(), 0); + /// map.insert("a".to_string(), 1); + /// map.insert("b".to_string(), 2); + /// assert_eq!(map.len(), 2); + /// ``` pub fn len(&self) -> u32 { self.keys.len() } /// Returns true if there are no elements inside of the map. + /// + /// # Example + /// ``` + /// use near_sdk::store::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"b"); + /// assert!(map.is_empty()); + /// map.insert("a".to_string(), 1); + /// assert!(!map.is_empty()); + /// ``` pub fn is_empty(&self) -> bool { self.keys.is_empty() } /// Clears the map, removing all key-value pairs. Keeps the allocated memory /// for reuse. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"b"); + /// map.insert("a".to_string(), 1); + /// + /// map.clear(); + /// + /// assert!(map.is_empty()); + /// ``` pub fn clear(&mut self) where K: BorshDeserialize + Clone, @@ -378,6 +421,16 @@ where /// The key may be any borrowed form of the map's key type, but /// [`BorshSerialize`] and [`ToOwned`](ToOwned) on the borrowed form *must* match /// those for the key type. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"b"); + /// assert!(map.insert("test".to_string(), 5u8).is_none()); + /// assert_eq!(map.get("test"), Some(&5)); + /// ``` pub fn get(&self, k: &Q) -> Option<&V> where K: Borrow, @@ -391,6 +444,18 @@ where /// The key may be any borrowed form of the map's key type, but /// [`BorshSerialize`] and [`ToOwned`](ToOwned) on the borrowed form *must* match /// those for the key type. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"b"); + /// assert!(map.insert("test".to_string(), 5u8).is_none()); + /// + /// *map.get_mut("test").unwrap() = 6; + /// assert_eq!(map["test"], 6); + /// ``` pub fn get_mut(&mut self, k: &Q) -> Option<&mut V> where K: Borrow, @@ -406,6 +471,20 @@ where /// If the map did have this key present, the value is updated, and the old /// value is returned. The key is not updated, though; this matters for /// types that can be `==` without being identical. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"b"); + /// assert!(map.is_empty()); + /// + /// map.insert("a".to_string(), 1); + /// + /// assert!(!map.is_empty()); + /// assert_eq!(map.values().collect::>(), [&1]); + /// ``` pub fn insert(&mut self, k: K, value: V) -> Option where K: Clone + BorshDeserialize, @@ -427,6 +506,17 @@ where /// The key may be any borrowed form of the map's key type, but /// [`BorshSerialize`] and [`ToOwned`](ToOwned) on the borrowed form *must* match /// those for the key type. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"b"); + /// map.insert("test".to_string(), 7u8); + /// + /// assert!(map.contains_key("test")); + /// ``` pub fn contains_key(&self, k: &Q) -> bool where K: Borrow, @@ -441,6 +531,20 @@ where /// The key may be any borrowed form of the map's key type, but /// [`BorshSerialize`] and [`ToOwned`](ToOwned) on the borrowed form *must* match /// those for the key type. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::UnorderedMap; + /// + /// let mut map: UnorderedMap = UnorderedMap::new(b"b"); + /// map.insert("test".to_string(), 7u8); + /// assert_eq!(map.len(), 1); + /// + /// map.remove("test"); + /// + /// assert_eq!(map.len(), 0); + /// ``` pub fn remove(&mut self, k: &Q) -> Option where K: Borrow + BorshDeserialize, diff --git a/near-sdk/src/store/vec/mod.rs b/near-sdk/src/store/vec/mod.rs index 2072e5b61..73fd3771d 100644 --- a/near-sdk/src/store/vec/mod.rs +++ b/near-sdk/src/store/vec/mod.rs @@ -100,16 +100,47 @@ where /// Returns the number of elements in the vector, also referred to as its size. /// This function returns a `u32` rather than the [`Vec`] equivalent of `usize` to have /// consistency between targets. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"a"); + /// vec.push(1); + /// vec.push(2); + /// assert_eq!(vec.len(), 2); + /// ``` pub fn len(&self) -> u32 { self.len } /// Returns `true` if the vector contains no elements. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"a"); + /// assert!(vec.is_empty()); + /// + /// vec.push(1); + /// assert!(!vec.is_empty()); + /// ``` pub fn is_empty(&self) -> bool { self.len == 0 } /// Create new vector with zero elements. Prefixes storage accesss with the prefix provided. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec: Vector = Vector::new(b"a"); + /// ``` pub fn new(prefix: S) -> Self where S: IntoStorageKey, @@ -119,6 +150,19 @@ where /// Removes all elements from the collection. This will remove all storage values for the /// length of the [`Vector`]. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"a"); + /// vec.push(1); + /// + /// vec.clear(); + /// + /// assert!(vec.is_empty()); + /// ``` pub fn clear(&mut self) { for i in 0..self.len { self.values.set(i, None); @@ -137,6 +181,19 @@ where /// # Panics /// /// Panics if `index` is out of bounds. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"v"); + /// vec.push("test".to_string()); + /// + /// vec.set(0,"new_value".to_string()); + /// + /// assert_eq!(vec.get(0),Some(&"new_value".to_string())); + /// ``` pub fn set(&mut self, index: u32, value: T) { if index >= self.len() { env::panic_str(ERR_INDEX_OUT_OF_BOUNDS); @@ -150,6 +207,17 @@ where /// # Panics /// /// Panics if new length exceeds `u32::MAX` + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"v"); + /// vec.push("test".to_string()); + /// + /// assert!(!vec.is_empty()); + /// ``` pub fn push(&mut self, element: T) { let last_idx = self.len(); self.len = @@ -163,6 +231,18 @@ where T: BorshSerialize + BorshDeserialize, { /// Returns the element by index or `None` if it is not present. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"v"); + /// vec.push("test".to_string()); + /// + /// assert_eq!(Some(&"test".to_string()), vec.get(0)); + /// assert_eq!(None, vec.get(3)); + /// ``` pub fn get(&self, index: u32) -> Option<&T> { if index >= self.len() { return None; @@ -171,6 +251,23 @@ where } /// Returns a mutable reference to the element at the `index` provided. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"v"); + /// let x = vec![0, 1, 2]; + /// vec.extend(x); + /// + /// if let Some(elem) = vec.get_mut(1) { + /// *elem = 42; + /// } + /// + /// let actual: Vec<_> = vec.iter().cloned().collect(); + /// assert_eq!(actual, &[0, 42, 2]); + /// ``` pub fn get_mut(&mut self, index: u32) -> Option<&mut T> { if index >= self.len { return None; @@ -193,6 +290,21 @@ where /// # Panics /// /// Panics if `index` is out of bounds. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec: Vector = Vector::new(b"v"); + /// let baseline = vec![1, 2, 3]; + /// vec.extend(baseline.clone()); + /// + /// vec.swap_remove(0); + /// + /// assert_eq!(vec.get(0), Some(&3)); + /// assert_eq!(vec.swap_remove(1), 2); + /// ``` pub fn swap_remove(&mut self, index: u32) -> T { if self.is_empty() { env::panic_str(ERR_INDEX_OUT_OF_BOUNDS); @@ -203,6 +315,19 @@ where } /// Removes the last element from a vector and returns it, or `None` if it is empty. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"v"); + /// let x = vec![1,2,3]; + /// vec.extend(x); + /// + /// assert_eq!(vec.pop(), Some(3)); + /// assert_eq!(vec.pop(), Some(2)); + /// ``` pub fn pop(&mut self) -> Option { let new_idx = self.len.checked_sub(1)?; let prev = self.values.get_mut_inner(new_idx).replace(None); @@ -216,6 +341,19 @@ where /// /// If `index` is out of bounds. // TODO determine if this should be stabilized, included for backwards compat with old version + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"v"); + /// vec.push("test".to_string()); + /// + /// vec.replace(0,"replaced".to_string()); + /// + /// assert_eq!(vec.get(0), Some(&"replaced".to_string())); + /// ``` pub fn replace(&mut self, index: u32, element: T) -> T { if index >= self.len { env::panic_str(ERR_INDEX_OUT_OF_BOUNDS); @@ -225,12 +363,40 @@ where /// Returns an iterator over the vector. This iterator will lazily load any values iterated /// over from storage. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"v"); + /// let baseline = vec![0u8, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + /// vec.extend(baseline.clone()); + /// + /// assert_eq!(vec.iter().copied().collect::>(), vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + /// ``` pub fn iter(&self) -> Iter { Iter::new(self) } /// Returns an iterator over the [`Vector`] that allows modifying each value. This iterator /// will lazily load any values iterated over from storage. + /// + /// # Examples + /// + /// ``` + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"v"); + /// let baseline = vec![1, 2, 3]; + /// vec.extend(baseline.clone()); + /// + /// let mut iter = vec.iter_mut(); + /// + /// assert_eq!(iter.next(), Some(&mut 1)); + /// assert_eq!(iter.next(), Some(&mut 2)); + /// assert_eq!(iter.next(), Some(&mut 3)); + /// ``` pub fn iter_mut(&mut self) -> IterMut { IterMut::new(self) } @@ -245,6 +411,23 @@ where /// /// This will not panic on invalid ranges (`end > length` or `end < start`) and instead the /// iterator will just be empty. + /// + /// # Examples + /// + /// ``` + /// + /// use near_sdk::store::Vector; + /// + /// let mut vec = Vector::new(b"v"); + /// let mut baseline = vec![1, 2, 3]; + /// vec.extend(baseline.clone()); + /// + /// assert!(Iterator::eq(vec.drain(..), baseline.drain(..))); + /// + /// // A full range clears the vector + /// vec.drain(..); + /// assert_eq!(vec.len(), 0) + /// ``` pub fn drain(&mut self, range: R) -> Drain where R: RangeBounds, From 5e2e2a28108775c0f96353007e48857214f1dadd Mon Sep 17 00:00:00 2001 From: austinabell Date: Thu, 14 Apr 2022 15:12:53 -0400 Subject: [PATCH 6/6] remove mac ds store file --- .gitignore | 1 + near-sdk/src/.DS_Store | Bin 6148 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 near-sdk/src/.DS_Store diff --git a/.gitignore b/.gitignore index cb3e01a8c..c55348e5a 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ neardev .idea .vscode +**/.DS_Store diff --git a/near-sdk/src/.DS_Store b/near-sdk/src/.DS_Store deleted file mode 100644 index 3f08b64409e1ee175bbbd898db56563510fd0314..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!Ab)$5KU^;v_N)yjFhYgk?T1^cFi&t zF~yRZXmb2V2Jq}^aB7Oh@cVjxsh_9!eyn_mc=zw)D9xJ94_;a*FD@+$Q5Dsd>ZN9=h!>;vRmKUCrZT=+w)JOFu$s=9jGMpq9p9=Lz9f$_t3AKZQttKZ=19{CvdmG9n7t_?AGF79ER)K^OtyCKb@6a{I*KCLR3J#yJ)XgC?DEy)w*WSLXJG z!u9IlmpYtr#~`)D05LGlz=G-4vHl3o49pb+yxeuW9oUkstuvd$S}Q?& qpePtu7@VYlp-VBuVkzDL)dGHr2B2fHFbEzH`Vi1GP(uv-DFdIfkW~Bt