use near_sdk::{ env::{self, panic_str}, serde_json, Promise, PromiseIndex, }; use serde::Serialize; pub trait SdkExpect { fn sdk_expect(self, msg: &str) -> T; } impl SdkExpect for Option { fn sdk_expect(self, msg: &str) -> T { self.unwrap_or_else(|| panic_str(msg)) } } impl SdkExpect for Result { fn sdk_expect(self, msg: &str) -> T { self.unwrap_or_else(|_| panic_str(msg)) } } pub enum PromiseOrPromiseIndexOrValue { Promise(Promise), PromiseIndex(PromiseIndex), Value(T), } impl PromiseOrPromiseIndexOrValue where T: Serialize, { #[allow(clippy::wrong_self_convention)] pub fn as_return(self) { match self { PromiseOrPromiseIndexOrValue::Promise(promise) => { promise.as_return().detach(); } PromiseOrPromiseIndexOrValue::PromiseIndex(promise_index) => { env::promise_return(promise_index); } PromiseOrPromiseIndexOrValue::Value(value) => { env::value_return(serde_json::to_vec(&value).unwrap()); } } } } impl From for PromiseOrPromiseIndexOrValue { fn from(promise: Promise) -> Self { PromiseOrPromiseIndexOrValue::Promise(promise) } }