pub struct PortfolioServiceImpl {
portfolios: Arc<RwLock<HashMap<WalletAddress, PortfolioBalance>>>,
ledger: Arc<RwLock<Option<Arc<dyn Ledger + Send + Sync>>>>,
tier_cache: Arc<RwLock<Option<Arc<TierCache>>>>,
perp_position_timestamps: Arc<RwLock<HashMap<(WalletAddress, String), u64>>>,
}Expand description
Implementation of PortfolioService.
Manages in-memory portfolio state with pure state mutations. Tests can still attach a Ledger to exercise legacy PortfolioService APIs, but production balance reads are owned by EngineSnapshot.balance_ledger.
Fill persistence is journal-owned. This service only applies the in-memory position projection for already-authoritative fill events.
Fields§
§portfolios: Arc<RwLock<HashMap<WalletAddress, PortfolioBalance>>>In-memory portfolio state keyed by account address.
ledger: Arc<RwLock<Option<Arc<dyn Ledger + Send + Sync>>>>Optional legacy ledger used by direct PortfolioService tests. Production cache paths do not attach a DB-backed ledger here.
tier_cache: Arc<RwLock<Option<Arc<TierCache>>>>Optional tier cache for checking margin mode. Required for premium settlement in Standard margin mode.
perp_position_timestamps: Arc<RwLock<HashMap<(WalletAddress, String), u64>>>Last-seen timestamp per (wallet, symbol) for perp position updates. Prevents stale REST-polled updates from overwriting fresher WS-fed data.
Implementations§
Source§impl PortfolioServiceImpl
impl PortfolioServiceImpl
Sourcepub async fn set_ledger(&self, ledger: Arc<dyn Ledger + Send + Sync>)
pub async fn set_ledger(&self, ledger: Arc<dyn Ledger + Send + Sync>)
Set the legacy ledger used by direct PortfolioService tests.
Sourcepub async fn set_tier_cache(&self, tier_cache: Arc<TierCache>)
pub async fn set_tier_cache(&self, tier_cache: Arc<TierCache>)
Set the tier cache for checking margin mode.
When set, option fills will apply premium settlement for Standard margin mode. Premium is debited on buy, credited on sell - directly affecting USDC balance.
Apply option premium settlement for Standard margin mode accounts.
In Standard margin mode, option premium is settled in USDC at fill time:
- Buy option: USDC balance decreases by premium (debit)
- Sell option: USDC balance increases by premium (credit)
In Portfolio margin mode, this does nothing (premium is financed via margin).
Sourcepub async fn reset_from_snapshots(
&self,
snapshots: HashMap<WalletAddress, PortfolioBalance>,
) -> Result<()>
pub async fn reset_from_snapshots( &self, snapshots: HashMap<WalletAddress, PortfolioBalance>, ) -> Result<()>
Reset portfolio state from snapshots (for initialization from DB).
Replaces all in-memory state with the provided snapshots.
Sourcepub async fn all_portfolios(&self) -> HashMap<WalletAddress, PortfolioBalance>
pub async fn all_portfolios(&self) -> HashMap<WalletAddress, PortfolioBalance>
Get all portfolios as a snapshot (for persistence).
Returns a clone of all in-memory portfolio state.
Sourcepub async fn get_portfolio_balance(
&self,
account: &WalletAddress,
) -> Option<PortfolioBalance>
pub async fn get_portfolio_balance( &self, account: &WalletAddress, ) -> Option<PortfolioBalance>
Get the internal PortfolioBalance for a specific account.
Returns None if account doesn’t exist. This is for risk/margin calculations - use get_portfolio() for API responses.
Sourcepub async fn update_market_prices(&self, prices: HashMap<String, Decimal>)
pub async fn update_market_prices(&self, prices: HashMap<String, Decimal>)
Update market prices for unrealized PnL calculations.
Not an event - ephemeral mark-to-market updates.
Sourceasync fn handle_fill(
&self,
wallet: &WalletAddress,
symbol: &str,
side: Side,
price: Decimal,
quantity: Decimal,
) -> Decimal
async fn handle_fill( &self, wallet: &WalletAddress, symbol: &str, side: Side, price: Decimal, quantity: Decimal, ) -> Decimal
Handle a fill event for a specific wallet (acquires lock internally).
This is for backward compatibility with tests. For atomic taker+maker fills,
use apply_fill_locked directly under a single lock.
Note: Uses trade_id=0 which means idempotency is disabled for test calls. Each call will be processed (not skipped).
§Returns
The realized PnL from closing positions in this fill.
Sourcefn update_position_for_fill(
portfolio: &mut PortfolioBalance,
symbol: &str,
side: &Side,
price: Decimal,
quantity: Decimal,
) -> Decimal
fn update_position_for_fill( portfolio: &mut PortfolioBalance, symbol: &str, side: &Side, price: Decimal, quantity: Decimal, ) -> Decimal
Apply a fill to a wallet’s portfolio without acquiring the lock.
The caller must hold self.portfolios.write() and pass the mutable reference.
This allows atomic application of taker+maker fills under a single lock.
§Idempotency
If trade_id has already been applied to this wallet, the fill is skipped.
This makes replay safe - applying the same fill twice is a no-op.
Update position for a fill and return the realized PnL.
This is a pure in-memory operation used by both apply_fill_locked
(for event processing) and apply_fill_to_memory (for memory-only updates).
§Arguments
portfolio- The portfolio to updatesymbol- Trading symbolside- Buy or Sellprice- Fill pricequantity- Fill quantity (positive)
§Returns
The realized PnL from closing positions in this fill.
Sourcefn apply_fill_locked(
portfolios: &mut HashMap<WalletAddress, PortfolioBalance>,
wallet: &WalletAddress,
_trade_id: u64,
symbol: &str,
side: Side,
price: Decimal,
quantity: Decimal,
) -> Decimal
fn apply_fill_locked( portfolios: &mut HashMap<WalletAddress, PortfolioBalance>, wallet: &WalletAddress, _trade_id: u64, symbol: &str, side: Side, price: Decimal, quantity: Decimal, ) -> Decimal
§Returns
The realized PnL from closing positions in this fill.
- Positive: profit from closing
- Negative: loss from closing
- Zero: no position was closed (pure open/add), OR fill was skipped (idempotent)
Sourceasync fn apply_realized_pnl_to_ledger(
&self,
wallet: &WalletAddress,
realized_pnl: Decimal,
) -> Result<(), PortfolioError>
async fn apply_realized_pnl_to_ledger( &self, wallet: &WalletAddress, realized_pnl: Decimal, ) -> Result<(), PortfolioError>
Apply realized PnL to the legacy test ledger if configured.
This is called after handle_fill when there’s a non-zero realized PnL.
§Errors
Returns PortfolioError::LedgerError if the ledger update fails.
Production fill persistence is journal-owned; runtime collateral comes
from EngineSnapshot.balance_ledger.
Sourcepub async fn calculate_fill_accounting(
&self,
fill: &Fill,
) -> Result<FillAccounting, PortfolioError>
pub async fn calculate_fill_accounting( &self, fill: &Fill, ) -> Result<FillAccounting, PortfolioError>
Calculate the accounting delta that would result from applying a fill.
This is a pure calculation with no side effects. Used to determine what to write to the ledger in the atomic DB transaction.
IMPORTANT: For Standard margin mode on OPTIONS, we use premium settlement only. The premium flow (buy = debit, sell = credit) already captures the P&L:
- Buy at $1000 → debit $1000
- Sell at $700 → credit $700
- Net = -$300 (loss is implicit in premium flow)
For Portfolio margin or perps, we use realized PnL instead.
fn calculate_fill_accounting_against_portfolios( portfolios: &HashMap<WalletAddress, PortfolioBalance>, fill: &Fill, taker_uses_premium: bool, maker_uses_premium: bool, ) -> FillAccounting
fn fill_accounting_position_for_wallet( portfolios: &HashMap<WalletAddress, PortfolioBalance>, wallet: &WalletAddress, symbol: &str, ) -> Option<FillAccountingPosition>
fn cash_settlement_for_fill(uses_premium: bool) -> FillCashSettlement
Returns whether this fill should settle option premium through the premium ledger.
Sourcefn get_position_change_locked(
portfolios: &HashMap<WalletAddress, PortfolioBalance>,
wallet: &WalletAddress,
symbol: &str,
) -> PositionChange
fn get_position_change_locked( portfolios: &HashMap<WalletAddress, PortfolioBalance>, wallet: &WalletAddress, symbol: &str, ) -> PositionChange
Get position change for notification, under lock.
Returns a PositionChange struct capturing the current state of the position. If position doesn’t exist (closed), returns zeroed values.
Sourcepub async fn apply_fill_to_memory(
&self,
wallet: &WalletAddress,
symbol: &str,
side: &Side,
price: Decimal,
quantity: Decimal,
)
pub async fn apply_fill_to_memory( &self, wallet: &WalletAddress, symbol: &str, side: &Side, price: Decimal, quantity: Decimal, )
Apply a fill’s position changes to in-memory state only.
This does NOT update the durable ledger. Live fills are journal-authoritative, and restart replay also uses this path for position-only reconstruction.
Sourcepub async fn apply_fill_to_memory_both_sides(
&self,
taker_wallet: &WalletAddress,
maker_wallet: &WalletAddress,
symbol: &str,
taker_side: &Side,
maker_side: &Side,
price: Decimal,
quantity: Decimal,
)
pub async fn apply_fill_to_memory_both_sides( &self, taker_wallet: &WalletAddress, maker_wallet: &WalletAddress, symbol: &str, taker_side: &Side, maker_side: &Side, price: Decimal, quantity: Decimal, )
Apply a fill’s position changes for both taker and maker atomically under a single write lock.
pub async fn apply_option_custody_delta( &self, wallet: &WalletAddress, symbol: &str, quantity_delta: Decimal, ) -> PortfolioChange
Trait Implementations§
Source§impl Default for PortfolioServiceImpl
impl Default for PortfolioServiceImpl
Source§impl PortfolioService for PortfolioServiceImpl
impl PortfolioService for PortfolioServiceImpl
Source§fn get_portfolio<'life0, 'life1, 'async_trait>(
&'life0 self,
account: &'life1 WalletAddress,
) -> Pin<Box<dyn Future<Output = Portfolio> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_portfolio<'life0, 'life1, 'async_trait>(
&'life0 self,
account: &'life1 WalletAddress,
) -> Pin<Box<dyn Future<Output = Portfolio> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn get_portfolio_balance<'life0, 'life1, 'async_trait>(
&'life0 self,
account: &'life1 WalletAddress,
) -> Pin<Box<dyn Future<Output = Option<PortfolioBalance>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_portfolio_balance<'life0, 'life1, 'async_trait>(
&'life0 self,
account: &'life1 WalletAddress,
) -> Pin<Box<dyn Future<Output = Option<PortfolioBalance>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn all_portfolios<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HashMap<WalletAddress, PortfolioBalance>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn all_portfolios<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HashMap<WalletAddress, PortfolioBalance>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn apply_event<'life0, 'life1, 'async_trait>(
&'life0 self,
event: &'life1 EngineMessage,
) -> Pin<Box<dyn Future<Output = Result<Vec<PortfolioChange>, PortfolioError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn apply_event<'life0, 'life1, 'async_trait>(
&'life0 self,
event: &'life1 EngineMessage,
) -> Pin<Box<dyn Future<Output = Result<Vec<PortfolioChange>, PortfolioError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn apply_hypercore_position_update<'life0, 'life1, 'async_trait>(
&'life0 self,
update: &'life1 HypercorePositionUpdate,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn apply_hypercore_position_update<'life0, 'life1, 'async_trait>(
&'life0 self,
update: &'life1 HypercorePositionUpdate,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn set_hypercore_position<'life0, 'life1, 'async_trait>(
&'life0 self,
update: &'life1 HypercorePositionUpdate,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn set_hypercore_position<'life0, 'life1, 'async_trait>(
&'life0 self,
update: &'life1 HypercorePositionUpdate,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn calculate_fill_accounting<'life0, 'life1, 'async_trait>(
&'life0 self,
fill: &'life1 Fill,
) -> Pin<Box<dyn Future<Output = Result<FillAccounting, PortfolioError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn calculate_fill_accounting<'life0, 'life1, 'async_trait>(
&'life0 self,
fill: &'life1 Fill,
) -> Pin<Box<dyn Future<Output = Result<FillAccounting, PortfolioError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn apply_fill_to_memory<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
wallet: &'life1 WalletAddress,
symbol: &'life2 str,
side: &'life3 Side,
price: Decimal,
quantity: Decimal,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn apply_fill_to_memory<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
wallet: &'life1 WalletAddress,
symbol: &'life2 str,
side: &'life3 Side,
price: Decimal,
quantity: Decimal,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Source§fn remove_expired_position<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
wallet: &'life1 WalletAddress,
symbol: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn remove_expired_position<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
wallet: &'life1 WalletAddress,
symbol: &'life2 str,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Source§impl Snapshotable for PortfolioServiceImpl
impl Snapshotable for PortfolioServiceImpl
Source§type Key = WalletAddress
type Key = WalletAddress
Source§type State = PortfolioBalance
type State = PortfolioBalance
Source§fn list_all<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<HashMap<Self::Key, Self::State>, SnapshotError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn list_all<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<HashMap<Self::Key, Self::State>, SnapshotError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Auto Trait Implementations§
impl Freeze for PortfolioServiceImpl
impl !RefUnwindSafe for PortfolioServiceImpl
impl Send for PortfolioServiceImpl
impl Sync for PortfolioServiceImpl
impl Unpin for PortfolioServiceImpl
impl UnsafeUnpin for PortfolioServiceImpl
impl !UnwindSafe for PortfolioServiceImpl
Blanket Implementations§
§impl<T> AggregateExpressionMethods for T
impl<T> AggregateExpressionMethods for T
§fn aggregate_distinct(self) -> Self::Outputwhere
Self: DistinctDsl,
fn aggregate_distinct(self) -> Self::Outputwhere
Self: DistinctDsl,
DISTINCT modifier for aggregate functions Read more§fn aggregate_all(self) -> Self::Outputwhere
Self: AllDsl,
fn aggregate_all(self) -> Self::Outputwhere
Self: AllDsl,
ALL modifier for aggregate functions Read more§fn aggregate_filter<P>(self, f: P) -> Self::Outputwhere
P: AsExpression<Bool>,
Self: FilterDsl<<P as AsExpression<Bool>>::Expression>,
fn aggregate_filter<P>(self, f: P) -> Self::Outputwhere
P: AsExpression<Bool>,
Self: FilterDsl<<P as AsExpression<Bool>>::Expression>,
§fn aggregate_order<O>(self, o: O) -> Self::Outputwhere
Self: OrderAggregateDsl<O>,
fn aggregate_order<O>(self, o: O) -> Self::Outputwhere
Self: OrderAggregateDsl<O>,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<T> IntoSql for T
impl<T> IntoSql for T
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T, Conn> RunQueryDsl<Conn> for T
impl<T, Conn> RunQueryDsl<Conn> for T
§fn execute<'conn, 'query>(
self,
conn: &'conn mut Conn,
) -> <Conn as AsyncConnectionCore>::ExecuteFuture<'conn, 'query>where
Conn: AsyncConnectionCore + Send,
Self: ExecuteDsl<Conn> + 'query,
fn execute<'conn, 'query>(
self,
conn: &'conn mut Conn,
) -> <Conn as AsyncConnectionCore>::ExecuteFuture<'conn, 'query>where
Conn: AsyncConnectionCore + Send,
Self: ExecuteDsl<Conn> + 'query,
§fn load<'query, 'conn, U>(
self,
conn: &'conn mut Conn,
) -> AndThen<Self::LoadFuture<'conn>, TryCollect<Self::Stream<'conn>, Vec<U>>>where
U: Send,
Conn: AsyncConnectionCore,
Self: LoadQuery<'query, Conn, U> + 'query,
fn load<'query, 'conn, U>(
self,
conn: &'conn mut Conn,
) -> AndThen<Self::LoadFuture<'conn>, TryCollect<Self::Stream<'conn>, Vec<U>>>where
U: Send,
Conn: AsyncConnectionCore,
Self: LoadQuery<'query, Conn, U> + 'query,
§fn load_stream<'conn, 'query, U>(
self,
conn: &'conn mut Conn,
) -> Self::LoadFuture<'conn>where
Conn: AsyncConnectionCore,
U: 'conn,
Self: LoadQuery<'query, Conn, U> + 'query,
fn load_stream<'conn, 'query, U>(
self,
conn: &'conn mut Conn,
) -> Self::LoadFuture<'conn>where
Conn: AsyncConnectionCore,
U: 'conn,
Self: LoadQuery<'query, Conn, U> + 'query,
Stream] with the returned rows. Read more§fn get_result<'query, 'conn, U>(
self,
conn: &'conn mut Conn,
) -> AndThen<Self::LoadFuture<'conn>, LoadNext<Pin<Box<Self::Stream<'conn>>>>>where
U: Send + 'conn,
Conn: AsyncConnectionCore,
Self: LoadQuery<'query, Conn, U> + 'query,
fn get_result<'query, 'conn, U>(
self,
conn: &'conn mut Conn,
) -> AndThen<Self::LoadFuture<'conn>, LoadNext<Pin<Box<Self::Stream<'conn>>>>>where
U: Send + 'conn,
Conn: AsyncConnectionCore,
Self: LoadQuery<'query, Conn, U> + 'query,
§fn get_results<'query, 'conn, U>(
self,
conn: &'conn mut Conn,
) -> AndThen<Self::LoadFuture<'conn>, TryCollect<Self::Stream<'conn>, Vec<U>>>where
U: Send,
Conn: AsyncConnectionCore,
Self: LoadQuery<'query, Conn, U> + 'query,
fn get_results<'query, 'conn, U>(
self,
conn: &'conn mut Conn,
) -> AndThen<Self::LoadFuture<'conn>, TryCollect<Self::Stream<'conn>, Vec<U>>>where
U: Send,
Conn: AsyncConnectionCore,
Self: LoadQuery<'query, Conn, U> + 'query,
Vec with the affected rows. Read more§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.