pub struct TxSender {
pub signer: Actor,
pub rpc: ExtendedBitcoinRpc,
pub db: Database,
pub btc_syncer_consumer_id: String,
pub config: BridgeConfig,
cached_spendinfo: TaprootSpendInfo,
http_client: Client,
}Expand description
Manages the process of sending Bitcoin transactions, including handling fee bumping strategies like Replace-By-Fee (RBF) and Child-Pays-For-Parent (CPFP).
It interacts with a Bitcoin Core RPC endpoint (ExtendedBitcoinRpc) to query network state
(like fee rates) and submit transactions. It uses a Database to persist transaction
state, track confirmation status, and manage associated data like fee payer UTXOs.
The Actor provides signing capabilities for transactions controlled by this service.
Fields§
§signer: Actor§rpc: ExtendedBitcoinRpc§db: Database§btc_syncer_consumer_id: String§config: BridgeConfig§cached_spendinfo: TaprootSpendInfo§http_client: ClientImplementations§
Source§impl TxSender
impl TxSender
Sourceasync fn create_fee_payer_utxo(
&self,
bumped_id: u32,
tx: &Transaction,
fee_rate: FeeRate,
total_fee_payer_amount: Amount,
fee_payer_utxos_len: usize,
) -> Result<(), SendTxError>
async fn create_fee_payer_utxo( &self, bumped_id: u32, tx: &Transaction, fee_rate: FeeRate, total_fee_payer_amount: Amount, fee_payer_utxos_len: usize, ) -> Result<(), SendTxError>
Creates and broadcasts a new “fee payer” UTXO to be used for CPFP transactions.
This function is called when a CPFP attempt fails due to insufficient funds
in the existing confirmed fee payer UTXOs associated with a transaction (bumped_id).
It calculates the required fee based on the parent transaction (tx) and the current
fee_rate, adding a buffer (2x required fee + dust limit) to handle potential fee spikes.
It then sends funds to the TxSender’s own signer address using the RPC’s
send_to_address and saves the resulting UTXO information (outpoint, amount)
to the database, linking it to the bumped_id.
§Arguments
bumped_id- The database ID of the parent transaction requiring the fee bump.tx- The parent transaction itself.fee_rate- The target fee rate for the CPFP package.total_fee_payer_amount- The sum of amounts in currently available confirmed fee payer UTXOs.fee_payer_utxos_len- The number of currently available confirmed fee payer UTXOs.
Sourceasync fn create_child_tx(
&self,
p2a_anchor: OutPoint,
anchor_sat: Amount,
fee_payer_utxos: Vec<SpendableTxIn>,
parent_tx_size: Weight,
fee_rate: FeeRate,
) -> Result<Transaction, SendTxError>
async fn create_child_tx( &self, p2a_anchor: OutPoint, anchor_sat: Amount, fee_payer_utxos: Vec<SpendableTxIn>, parent_tx_size: Weight, fee_rate: FeeRate, ) -> Result<Transaction, SendTxError>
Creates a Child-Pays-For-Parent (CPFP) child transaction.
This transaction spends:
- The designated “P2A anchor” output of the parent transaction (
p2a_anchor). - One or more confirmed “fee payer” UTXOs (
fee_payer_utxos) controlled by thesigner.
It calculates the total fee required (required_fee) to make the combined parent + child
package attractive to miners at the target fee_rate. The required_fee is paid entirely
by this child transaction.
The remaining value (total input value - required_fee) is sent to the change_address.
§Signing
We sign the input spending the P2A anchor and all fee payer UTXOs.
§Returns
The constructed and partially signed child transaction.
Sourceasync fn create_package(
&self,
tx: Transaction,
fee_rate: FeeRate,
fee_payer_utxos: Vec<SpendableTxIn>,
) -> Result<Vec<Transaction>, SendTxError>
async fn create_package( &self, tx: Transaction, fee_rate: FeeRate, fee_payer_utxos: Vec<SpendableTxIn>, ) -> Result<Vec<Transaction>, SendTxError>
Creates a transaction package for CPFP submission.
Finds the P2A anchor output in the parent transaction (tx), then constructs
the child transaction using create_child_tx.
§Returns
Vec<Transaction>: Parent transaction followed by the child transaction ready for submission via thesubmitpackageRPC.
Sourceasync fn get_confirmed_fee_payer_utxos(
&self,
try_to_send_id: u32,
) -> Result<Vec<SpendableTxIn>, SendTxError>
async fn get_confirmed_fee_payer_utxos( &self, try_to_send_id: u32, ) -> Result<Vec<SpendableTxIn>, SendTxError>
Retrieves confirmed fee payer UTXOs associated with a specific send attempt.
Queries the database for UTXOs linked to try_to_send_id that are marked as confirmed.
These UTXOs are controlled by the TxSender’s signer and are intended to be
spent by a CPFP child transaction.
§Returns
Vec<SpendableTxIn>:SpendableTxIns of the confirmed fee payer UTXOs that are ready to be included as inputs in the CPFP child tx.
Sourcepub(crate) async fn bump_fees_of_unconfirmed_fee_payer_txs(
&self,
fee_rate: FeeRate,
) -> Result<(), SendTxError>
pub(crate) async fn bump_fees_of_unconfirmed_fee_payer_txs( &self, fee_rate: FeeRate, ) -> Result<(), SendTxError>
Attempts to bump the fees of unconfirmed “fee payer” UTXOs using RBF.
Fee payer UTXOs are created to fund CPFP child transactions. However, these
fee payer creation transactions might themselves get stuck due to low fees.
This function identifies such unconfirmed fee payer transactions associated with
a parent transaction (bumped_id) and attempts to RBF them using the provided fee_rate.
This ensures the fee payer UTXOs confirm quickly, making them available to be spent by the actual CPFP child transaction.
§Arguments
bumped_id- The database ID of the parent transaction whose fee payer UTXOs need bumping.fee_rate- The target fee rate for bumping the fee payer transactions.
Sourcepub(super) async fn send_cpfp_tx(
&self,
try_to_send_id: u32,
tx: Transaction,
tx_metadata: Option<TxMetadata>,
fee_rate: FeeRate,
) -> Result<(), SendTxError>
pub(super) async fn send_cpfp_tx( &self, try_to_send_id: u32, tx: Transaction, tx_metadata: Option<TxMetadata>, fee_rate: FeeRate, ) -> Result<(), SendTxError>
Sends a transaction using the Child-Pays-For-Parent (CPFP) strategy.
§Logic:
- Check Unconfirmed Fee Payers: Ensures no unconfirmed fee payer UTXOs exist
for this
try_to_send_id. If they do, returnsSendTxError::UnconfirmedFeePayerUTXOsLeftas they need to confirm before being spendable by the child. - Get Confirmed Fee Payers: Retrieves the available confirmed fee payer UTXOs.
- Create Package: Calls
create_packageto build thevec![parent_tx, child_tx]. Thechild_txspends the parent’s anchor output and the fee payer UTXOs, paying a fee calculated for the whole package. - Test Mempool Accept (Debug step): Uses
testmempoolacceptRPC to check if the package is likely to be accepted by the network before submitting. - Submit Package: Uses the
submitpackageRPC to atomically submit the parent and child transactions. Bitcoin Core evaluates the fee rate of the package together. - Handle Results: Checks the
submitpackageresult. If successful or already in mempool, updates the effective fee rate in the database. If failed, logs an error.
§Arguments
try_to_send_id- The database ID tracking this send attempt.tx- The parent transaction requiring the fee bump.tx_metadata- Optional metadata associated with the transaction.fee_rate- The target fee rate for the CPFP package.
Source§impl TxSender
impl TxSender
Sourcepub fn is_bridge_tx_nonstandard(&self, tx: &Transaction) -> bool
pub fn is_bridge_tx_nonstandard(&self, tx: &Transaction) -> bool
Checks if a bridge transaction is nonstandard. Keep in mind that these are not all cases where a transaction is nonstandard. We only check non-standard types that clementine generates by default in non-standard mode. Currently checks these cases:
- The transaction contains 0 sat non-anchor (only checks our specific anchor address) and non-op return output.
- The transaction weight is bigger than 400k
Arguments:
tx- The transaction to check.
Returns:
trueif the transaction is nonstandard,falseotherwise.
Sourcepub async fn send_testnet4_nonstandard_tx(
&self,
tx: &Transaction,
try_to_send_id: u32,
) -> Result<(), SendTxError>
pub async fn send_testnet4_nonstandard_tx( &self, tx: &Transaction, try_to_send_id: u32, ) -> Result<(), SendTxError>
Sends a nonstandard transaction to testnet4 using the mempool.space accelerator.
Arguments:
tx- The transaction to send.
Returns:
Ok(())if the transaction is sent successfully to the accelerator.Err(SendTxError)if the transaction is not sent successfully to the accelerator.
Note: Mempool.space accelerator doesn’t accept transactions if: - At least one of the transaction’s inputs is signed with either the SIGHASH_NONE or SIGHASH_ANYONECANPAY flag, which may allow a third party to replace the transaction. - The number of signature operations multiplied by 20 exceeds the transaction’s weight. Mempool Space API docs Mempool Space Accelerator FAQ
Source§impl TxSender
impl TxSender
Sourcepub async fn calculate_bump_feerate_if_needed(
&self,
txid: &Txid,
new_feerate: FeeRate,
) -> Result<Option<FeeRate>, SendTxError>
pub async fn calculate_bump_feerate_if_needed( &self, txid: &Txid, new_feerate: FeeRate, ) -> Result<Option<FeeRate>, SendTxError>
Calculates the appropriate fee rate for a Replace-By-Fee (RBF) transaction.
This method determines the effective fee rate needed to successfully replace an existing transaction in the mempool. It follows Bitcoin’s RBF rules by:
- Retrieving the original transaction and calculating its current fee rate
- Ensuring the new fee rate is higher than the original by at least the minimum required incremental relay fee
- Comparing the calculated minimum bump fee rate with the requested target fee rate and selecting the higher of the two
§Arguments
txid- The transaction ID of the original transaction to be replacednew_feerate- The target fee rate requested for the replacement transaction
§Returns
Ok(Some(FeeRate))- The effective fee rate (in satoshis per kilo-wu) to use for the replacementOk(None)- If the original transaction already has a higher fee rate than requestedErr(...)- If there was an error retrieving or analyzing the original transaction
pub async fn fill_in_utxo_info( &self, psbt: &mut String, ) -> Result<(), SendTxError>
Sourcepub async fn copy_witnesses(
&self,
psbt: String,
initial_tx: &Transaction,
) -> Result<String, SendTxError>
pub async fn copy_witnesses( &self, psbt: String, initial_tx: &Transaction, ) -> Result<String, SendTxError>
Given a PSBT with inputs, fill in the existing witnesses from the original tx This allows us to create a finalized PSBT if the original tx had SinglePlusAnyoneCanPay signatures. If the original tx did not have S+AP, these signatures will be added. The expected behavior is for them to be replaced using RbfSigningInfo.
§Returns
The PSBT as a base64-encoded string.
pub async fn create_funded_psbt( &self, tx: &Transaction, fee_rate: FeeRate, ) -> Result<WalletCreateFundedPsbtResult, SendTxError>
Sourcepub async fn attempt_sign_psbt(
&self,
psbt: String,
rbf_signing_info: RbfSigningInfo,
) -> Result<String, SendTxError>
pub async fn attempt_sign_psbt( &self, psbt: String, rbf_signing_info: RbfSigningInfo, ) -> Result<String, SendTxError>
Given a PSBT with inputs that’ve been signed by the wallet except for our new input, we have to sign the first input with our self.signer actor.
Assumes that the first input is the input with our key.
§Returns
The signed PSBT as a base64-encoded string.
pub fn handle_err( &self, err_msg: impl AsRef<str>, err_state: impl Into<String>, try_to_send_id: u32, )
Sourcepub fn verify_new_inputs(&self, psbt: &str, original_tx: &Transaction) -> bool
pub fn verify_new_inputs(&self, psbt: &str, original_tx: &Transaction) -> bool
This function verifies that the wallet has added a funding input to the PSBT.
This is required for a transaction to be added to the wallet.
pub async fn get_tx_fee(&self, tx: &Transaction) -> Result<Amount, SendTxError>
Sourcepub(super) async fn send_rbf_tx(
&self,
try_to_send_id: u32,
tx: Transaction,
tx_metadata: Option<TxMetadata>,
fee_rate: FeeRate,
rbf_signing_info: Option<RbfSigningInfo>,
) -> Result<(), SendTxError>
pub(super) async fn send_rbf_tx( &self, try_to_send_id: u32, tx: Transaction, tx_metadata: Option<TxMetadata>, fee_rate: FeeRate, rbf_signing_info: Option<RbfSigningInfo>, ) -> Result<(), SendTxError>
Sends or bumps a transaction using the Replace-By-Fee (RBF) strategy.
It interacts with the database to track the latest RBF attempt (last_rbf_txid).
§Logic:
-
Check for Existing RBF Tx: Retrieves
last_rbf_txidfor thetry_to_send_id. -
Bump Existing Tx: If
psbt_bump_feeexists, it callsrpc.psbt_bump_fee.- This internally uses the Bitcoin Core
psbtbumpfeeRPC. - We then sign the inputs that we can using our Actor and have the wallet sign the rest.
- This internally uses the Bitcoin Core
-
Send Initial RBF Tx: If no
last_rbf_txidexists (first attempt):- It uses
fund_raw_transactionRPC to let the wallet add (potentially) inputs, outputs, set the fee according tofee_rate, and mark the transaction as replaceable. - Uses
sign_raw_transaction_with_walletRPC to sign the funded transaction. - Uses
send_raw_transactionRPC to broadcast the initial RBF transaction. - Saves the resulting
txidto the database as thelast_rbf_txid.
- It uses
§Arguments
try_to_send_id- The database ID tracking this send attempt.tx- The original transaction intended for RBF (used only on the first attempt).tx_metadata- Optional metadata associated with the transaction.fee_rate- The target fee rate for the RBF replacement.
Source§impl TxSender
impl TxSender
pub fn new( signer: Actor, rpc: ExtendedBitcoinRpc, db: Database, btc_syncer_consumer_id: String, config: BridgeConfig, ) -> Self
Sourceasync fn get_fee_rate(&self) -> Result<FeeRate, SendTxError>
async fn get_fee_rate(&self) -> Result<FeeRate, SendTxError>
Gets the current recommended fee rate in sat/vb from Mempool Space and Bitcoin Core and selects the minimum. For Regtest and Signet, it uses a fixed fee rate of 1 sat/vB.
§Logic
- Regtest: Uses a fixed fee rate of 1 sat/vB for simplicity.
- Mainnet, Testnet4 and Signet: Fetches fee rates from both Mempool Space API and Bitcoin Core RPC and takes the minimum.
- Hard Cap: Applies a hard cap from configuration to prevent excessive fees.
§Fallbacks
- If one source fails, it uses the other.
- If both fail, it falls back to a default of 1 sat/vB.
Sourcefn calculate_required_fee(
parent_tx_weight: Weight,
num_fee_payer_utxos: usize,
fee_rate: FeeRate,
fee_paying_type: FeePayingType,
) -> Result<Amount, SendTxError>
fn calculate_required_fee( parent_tx_weight: Weight, num_fee_payer_utxos: usize, fee_rate: FeeRate, fee_paying_type: FeePayingType, ) -> Result<Amount, SendTxError>
Calculates the total fee required for a transaction package based on the fee bumping strategy.
§Arguments
parent_tx_weight- The weight of the main transaction being bumped.num_fee_payer_utxos- The number of fee payer UTXOs used (relevant for child tx size in CPFP).fee_rate- The target fee rate (sat/kwu or similar).fee_paying_type- The strategy being used (CPFP or RBF).
§Calculation Logic
- CPFP: Calculates the weight of the hypothetical child transaction based on the number of fee payer inputs and standard P2TR output sizes. It then calculates the fee based on the combined virtual size (vbytes) of the parent and child transactions, as miners evaluate the package deal.
- RBF: Calculates the weight of the replacement transaction itself (assuming inputs and potentially outputs change slightly). The fee is calculated based on the weight of this single replacement transaction.
Reference for weight estimates: https://bitcoin.stackexchange.com/a/116959
fn is_p2a_anchor(&self, output: &TxOut) -> bool
fn find_p2a_vout(&self, tx: &Transaction) -> Result<usize, SendTxError>
Sourcefn btc_per_kvb_to_fee_rate(btc_per_kvb: f64) -> FeeRate
fn btc_per_kvb_to_fee_rate(btc_per_kvb: f64) -> FeeRate
Submit package returns the effective fee rate in btc/kvb. This function converts the btc/kvb to a fee rate in sat/vb.
Sourceasync fn try_to_send_unconfirmed_txs(
&self,
new_fee_rate: FeeRate,
current_tip_height: u32,
is_tip_height_increased: bool,
) -> Result<(), SendTxError>
async fn try_to_send_unconfirmed_txs( &self, new_fee_rate: FeeRate, current_tip_height: u32, is_tip_height_increased: bool, ) -> Result<(), SendTxError>
Fetches transactions that are eligible to be sent or bumped from database based on the given fee rate and tip height. Then, places a send transaction request to the Bitcoin based on the fee strategy.
For each eligible transaction (id):
- Send/Bump Main Tx: Calls
send_txto either perform RBF or CPFP on the main transaction (id) using thenew_fee_rate. - Handle Errors:
SendTxError::UnconfirmedFeePayerUTXOsLeft: Skips the current tx, waiting for fee payers to confirm.SendTxError::InsufficientFeePayerAmount: Callscreate_fee_payer_utxoto provision more funds for a future CPFP attempt.- Other errors are logged.
§Arguments
new_fee_rate- The current target fee rate based on network conditions.current_tip_height- The current blockchain height, used for time-lock checks.is_tip_height_increased- True if the tip height has increased since the last time we sent unconfirmed transactions.
pub fn client(&self) -> TxSenderClient
Sourcepub(crate) async fn send_no_funding_tx(
&self,
try_to_send_id: u32,
tx: Transaction,
tx_metadata: Option<TxMetadata>,
) -> Result<(), SendTxError>
pub(crate) async fn send_no_funding_tx( &self, try_to_send_id: u32, tx: Transaction, tx_metadata: Option<TxMetadata>, ) -> Result<(), SendTxError>
Sends a transaction that is already fully funded and signed.
This function is used for transactions that do not require fee bumping strategies like RBF or CPFP. The transaction is submitted directly to the Bitcoin network without any modifications.
§Arguments
try_to_send_id- The database ID tracking this send attempt.tx- The fully funded and signed transaction ready for broadcast.tx_metadata- Optional metadata associated with the transaction for debugging.
§Behavior
- Attempts to broadcast the transaction using
send_raw_transactionRPC. - Updates the database with success/failure state for debugging purposes.
- Logs appropriate messages for monitoring and troubleshooting.
§Returns
Ok(())- If the transaction was successfully broadcast.Err(SendTxError)- If the broadcast failed.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for TxSender
impl !RefUnwindSafe for TxSender
impl Send for TxSender
impl Sync for TxSender
impl Unpin for TxSender
impl !UnwindSafe for TxSender
Blanket Implementations§
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§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>. Box<dyn Any> can
then be further downcast into Box<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>. Rc<Any> 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> DowncastSync for T
impl<T> DowncastSync for T
§impl<T, U> ExactFrom<T> for Uwhere
U: TryFrom<T>,
impl<T, U> ExactFrom<T> for Uwhere
U: TryFrom<T>,
fn exact_from(value: T) -> U
§impl<T, U> ExactInto<U> for Twhere
U: ExactFrom<T>,
impl<T, U> ExactInto<U> for Twhere
U: ExactFrom<T>,
fn exact_into(self) -> U
§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> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> 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, U> OverflowingInto<U> for Twhere
U: OverflowingFrom<T>,
impl<T, U> OverflowingInto<U> for Twhere
U: OverflowingFrom<T>,
fn overflowing_into(self) -> (U, bool)
§impl<D> OwoColorize for D
impl<D> OwoColorize for D
§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg] or
a color-specific method, such as [OwoColorize::green], Read more§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg] or
a color-specific method, such as [OwoColorize::on_yellow], Read more§fn fg_rgb<const R: u8, const G: u8, const B: u8>(
&self,
) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
§fn bg_rgb<const R: u8, const G: u8, const B: u8>(
&self,
) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
§fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
§fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
§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, U> RoundingInto<U> for Twhere
U: RoundingFrom<T>,
impl<T, U> RoundingInto<U> for Twhere
U: RoundingFrom<T>,
fn rounding_into(self, rm: RoundingMode) -> (U, Ordering)
§impl<T, U> SaturatingInto<U> for Twhere
U: SaturatingFrom<T>,
impl<T, U> SaturatingInto<U> for Twhere
U: SaturatingFrom<T>,
fn saturating_into(self) -> U
§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.