Struct sn_client::Client

source ·
pub struct Client { /* private fields */ }
Expand description

Client API implementation to store and get data.

Implementations§

source§

impl Client

source

pub async fn quick_start(peers: Option<Vec<Multiaddr>>) -> Result<Self, Error>

A quick client with a random secret key and some peers.

source

pub async fn new( signer: SecretKey, peers: Option<Vec<Multiaddr>>, connection_timeout: Option<Duration>, client_event_broadcaster: Option<ClientEventsBroadcaster> ) -> Result<Self, Error>

Instantiate a new client.

Optionally specify the duration for the connection timeout.

Defaults to 180 seconds.

§Arguments
§Example
use sn_client::{Client, Error};
use bls::SecretKey;
let client = Client::new(SecretKey::random(), None, None, None).await?;
source

pub fn events_channel(&self) -> ClientEventsReceiver

Get the client events channel.

Return Type:

ClientEventsReceiver

§Example
use sn_client::{Client, Error, ClientEvent};
use bls::SecretKey;
let client = Client::new(SecretKey::random(), None, None, None).await?;
// Using client.events_channel() to publish messages
let mut events_channel = client.events_channel();
while let Ok(event) = events_channel.recv().await {
// Handle the event
 }
source

pub fn sign<T: AsRef<[u8]>>(&self, data: T) -> Signature

Sign the given data.

§Arguments
  • ‘data’ - bytes; i.e bytes of an sn_registers::Register instance

Return Type:

Signature

§Example
use sn_client::{Client, Error};
use bls::SecretKey;

use tracing::callsite::register;
use xor_name::XorName;
use sn_registers::Register;
use sn_protocol::messages::RegisterCmd;
let client = Client::new(SecretKey::random(), None, None, None).await?;

// Set up register prerequisites
let mut rng = rand::thread_rng();
let xorname = XorName::random(&mut rng);
let owner_sk = SecretKey::random();
let owner_pk = owner_sk.public_key();

// set up register
let mut register = Register::new(owner_pk, xorname, Default::default());
let mut register_clone = register.clone();

// Use of client.sign() with register through RegisterCmd::Create
let cmd = RegisterCmd::Create {
   register,
   signature: client.sign(register_clone.bytes()?),
};
source

pub fn signer(&self) -> &SecretKey

Return a reference to the signer secret key.

Return Type:

SecretKey

§Example
use sn_client::{Client, Error};
use bls::SecretKey;
let client = Client::new(SecretKey::random(), None, None, None).await?;
let secret_key_reference = client.signer();
source

pub fn signer_pk(&self) -> PublicKey

Return the public key of the data signing key.

Return Type:

PublicKey

§Example
use sn_client::{Client, Error};
use bls::SecretKey;
let client = Client::new(SecretKey::random(), None, None, None).await?;
let public_key_reference = client.signer_pk();
source

pub fn set_signer_key(&mut self, sk: SecretKey)

Set the signing key for this client.

§Arguments
§Example
use sn_client::{Client, Error};
use bls::SecretKey;
let mut client = Client::new(SecretKey::random(), None, None, None).await?;
client.set_signer_key(SecretKey::random());
source

pub async fn get_signed_register_from_network( &self, address: RegisterAddress, is_verifying: bool ) -> Result<SignedRegister, Error>

Get a register from network

§Arguments
  • ‘address’ - RegisterAddress
  • ‘is_verifying’ - Boolean: If true, we fetch at-least 2 copies from the network with more retry attempts.

Return Type:

Result<SignedRegister>

§Example
use sn_client::{Client, Error};
use bls::SecretKey;
use xor_name::XorName;
use sn_registers::RegisterAddress;
// Set up a client
let client = Client::new(SecretKey::random(), None, None, None).await?;
// Set up an address
let mut rng = rand::thread_rng();
let owner = SecretKey::random().public_key();
let xorname = XorName::random(&mut rng);
let address = RegisterAddress::new(xorname, owner);
// Get a signed register
let signed_register = client.get_signed_register_from_network(address,true);
source

pub async fn get_register( &self, address: RegisterAddress ) -> Result<ClientRegister, Error>

Retrieve a Register from the network.

§Arguments

Return Type:

Result<ClientRegister>

§Example
use sn_client::{Client, Error};
use bls::SecretKey;
use xor_name::XorName;
use sn_registers::RegisterAddress;
// Set up a client
let client = Client::new(SecretKey::random(), None, None, None).await?;
// Set up an address
let mut rng = rand::thread_rng();
let owner = SecretKey::random().public_key();
let xorname = XorName::random(&mut rng);
let address = RegisterAddress::new(xorname, owner);
// Get the register
let retrieved_register = client.get_register(address);
source

pub async fn create_and_pay_for_register( &self, address: XorName, wallet_client: &mut WalletClient, verify_store: bool, perms: Permissions ) -> Result<(ClientRegister, NanoTokens, NanoTokens), Error>

Create a new Register on the Network. Tops up payments and retries if necessary and verification failed

§Arguments

Return Type:

Result<(ClientRegister, NanoTokens, NanoTokens)>

§Example
use sn_client::{Client, WalletClient, Error};
use tempfile::TempDir;
use bls::SecretKey;
use sn_transfers::{MainSecretKey};
use xor_name::XorName;
use sn_registers::RegisterAddress;
// Set up Client, Wallet, etc
use sn_registers::Permissions;
use sn_transfers::HotWallet;
let client = Client::new(SecretKey::random(), None, None, None).await?;
let tmp_path = TempDir::new()?.path().to_owned();
let mut wallet = HotWallet::load_from_path(&tmp_path,Some(MainSecretKey::new(SecretKey::random())))?;
let mut wallet_client = WalletClient::new(client.clone(), wallet);
// Set up an address
let mut rng = rand::thread_rng();
let owner = SecretKey::random().public_key();
let xorname = XorName::random(&mut rng);
let address = RegisterAddress::new(xorname, owner);
// Example:
    let (mut client_register, _storage_cost, _royalties_fees) = client
        .create_and_pay_for_register(
            xorname,
            &mut wallet_client,
            true,
            Permissions::default(),
        )
        .await?;
source

pub async fn get_chunk( &self, address: ChunkAddress, show_holders: bool, retry_strategy: Option<RetryStrategy> ) -> Result<Chunk, Error>

Get chunk from chunk address.

§Arguments

Return Type:

Result<Chunk>

§Example
use sn_client::{Client, Error};
use bls::SecretKey;
use xor_name::XorName;
use sn_protocol::storage::ChunkAddress;
// client
let client = Client::new(SecretKey::random(), None, None, None).await?;
// chunk address
let mut rng = rand::thread_rng();
let xorname = XorName::random(&mut rng);
let chunk_address = ChunkAddress::new(xorname);
// get chunk
let chunk = client.get_chunk(chunk_address,true, None).await?;
source

pub async fn verify_chunk_stored(&self, chunk: &Chunk) -> Result<(), Error>

Verify if a Chunk is stored by expected nodes on the network. Single local use. Marked Private.

source

pub async fn verify_register_stored( &self, address: RegisterAddress ) -> Result<SignedRegister, Error>

Verify if a Register is stored by expected nodes on the network.

§Arguments

Return Type:

Result<SignedRegister>

§Example
use sn_client::{Client, Error};
use bls::SecretKey;
use xor_name::XorName;
use sn_registers::RegisterAddress;
// Set up Client
let client = Client::new(SecretKey::random(), None, None, None).await?;
// Set up an address
let mut rng = rand::thread_rng();
let owner = SecretKey::random().public_key();
let xorname = XorName::random(&mut rng);
let address = RegisterAddress::new(xorname, owner);
// Verify address is stored
let is_stored = client.verify_register_stored(address).await.is_ok();
source

pub async fn quickly_check_if_register_stored( &self, address: RegisterAddress ) -> Result<SignedRegister, Error>

Quickly checks if a Register is stored by expected nodes on the network.

To be used for initial register put checks eg, if we expect the data not to exist, we can use it and essentially use the RetryStrategy::Quick under the hood

§Example
use sn_client::{Client, Error};
use bls::SecretKey;
use xor_name::XorName;
use sn_registers::RegisterAddress;
// Set up Client
let client = Client::new(SecretKey::random(), None, None, None).await?;
// Set up an address
let mut rng = rand::thread_rng();
let owner = SecretKey::random().public_key();
let xorname = XorName::random(&mut rng);
let address = RegisterAddress::new(xorname, owner);
// Verify address is stored
let is_stored = client.verify_register_stored(address).await.is_ok();
source

pub async fn get_spend_from_network( &self, address: SpendAddress ) -> Result<SignedSpend, Error>

Get a spend from network.

§Arguments

Return Type:

Result<SignedSpend>

§Example
use sn_client::{Client, Error};
use bls::SecretKey;
use xor_name::XorName;
use sn_transfers::SpendAddress;
let client = Client::new(SecretKey::random(), None, None, None).await?;
// Create a SpendAddress
let mut rng = rand::thread_rng();
let xorname = XorName::random(&mut rng);
let spend_address = SpendAddress::new(xorname);
// Here we get the spend address
let spend = client.get_spend_from_network(spend_address).await?;
// Example: We can use the spend to get its unique public key:
let unique_pubkey = spend.unique_pubkey();
source

pub async fn crawl_spend_from_network( &self, address: SpendAddress ) -> Result<SignedSpend, Error>

This is a similar funcation to get_spend_from_network to get a spend from network. Just using different RetryStrategy to improve the performance during crawling.

source

pub async fn verify_cash_notes_redemptions( &self, main_pubkey: MainPubkey, cashnote_redemptions: &[CashNoteRedemption] ) -> Result<Vec<CashNote>, Error>

This function is used to receive a Vector of CashNoteRedemptions and turn them back into spendable CashNotes. For this we need a network connection. Verify CashNoteRedemptions and rebuild spendable currency from them. Returns an Error::InvalidTransfer if any CashNoteRedemption is not valid Else returns a list of CashNotes that can be spent by the owner.

§Arguments

Return Type:

Result<Vec<CashNote>>

§Example
use sn_client::{Client, Error};
use bls::SecretKey;
use sn_transfers::{CashNote, CashNoteRedemption, MainPubkey};
let client = Client::new(SecretKey::random(), None, None, None).await?;
// Create a main public key
let pk = SecretKey::random().public_key();
let main_pub_key = MainPubkey::new(pk);
// Create a Cash Note Redemption Vector
let cash_note = CashNote::from_hex("&hex").unwrap();
let cashNoteRedemption = CashNoteRedemption::from_cash_note(&cash_note).unwrap();
let vector = vec![cashNoteRedemption.clone(), cashNoteRedemption.clone()];
// Verify the cash note redemptions
let cash_notes = client.verify_cash_notes_redemptions(main_pub_key,&vector);
source§

impl Client

source

pub async fn verify_spend_at( &self, addr: SpendAddress, to_genesis: bool ) -> WalletResult<()>

Verify that a spend is valid on the network. Optionally verify its ancestors as well, all the way to genesis (might take a LONG time)

Prints progress on stdout.

When verifying all the way back to genesis, it only verifies Spends that are ancestors of the given Spend, ignoring all other branches.

This is how the DAG it follows could look like:

             ... --
                    \
             ... ----                  ... --
                      \                       \
Spend0 -> Spend1 -----> Spend2 ---> Spend5 ---> Spend2 ---> Genesis
                  \                           /
                   ---> Spend3 ---> Spend6 ->
                    \            /
                     -> Spend4 ->
                               /
                           ...

depth0    depth1        depth2      depth3      depth4      depth5

This function will return an error if any spend in the way is invalid.

source

pub async fn follow_spend( &self, spend_addr: SpendAddress ) -> WalletResult<BTreeSet<SpendAddress>>

This function does the opposite of verify_spend. It recursively follows the descendants of a Spend, all the way to unspent Transaction Outputs (UTXOs).

Prints progress on stdout

Starting from Genesis, this amounts to Auditing the entire currency. This is how the DAG it follows could look like:

                                  -> Spend7 ---> UTXO_11
                                /
Genesis -> Spend1 -----> Spend2 ---> Spend5 ---> UTXO_10
                  \
                    ---> Spend3 ---> Spend6 ---> UTXO_9
                    \
                      -> Spend4 ---> UTXO_8

gen0       gen1          gen2        gen3

This function will return the UTXOs (Spend addresses not spent yet) Future calls to this function could start from those UTXOs to avoid re-checking all previously checked branches.

source§

impl Client

source

pub async fn spend_dag_build_from( &self, spend_addr: SpendAddress, max_depth: Option<u32> ) -> WalletResult<SpendDag>

Builds a SpendDag from a given SpendAddress recursively following descendants all the way to UTxOs Started from Genesis this gives the entire SpendDag of the Network at a certain point in time Once the DAG collected, verifies and records errors in the DAG

source

pub async fn spend_dag_extend_until( &self, dag: &mut SpendDag, spend_addr: SpendAddress, new_spend: SignedSpend ) -> WalletResult<()>

Extends an existing SpendDag with a new SignedSpend, tracing back the ancestors of that Spend all the way to a known Spend in the DAG or else back to Genesis Verifies the DAG and records faults if any This is useful to keep a partial SpendDag to be able to verify that new spends come from Genesis

             ... --
                    \
             ... ----                  ... --
                      \                       \
Spend0 -> Spend1 -----> Spend2 ---> Spend5 ---> Spend2 ---> Genesis
                  \                           /
                   ---> Spend3 ---> Spend6 ->
                    \            /
                     -> Spend4 ->
                               /
                           ...

source

pub async fn spend_dag_continue_from_utxos( &self, dag: &mut SpendDag, max_depth: Option<u32> ) -> WalletResult<()>

Extends an existing SpendDag starting from the utxos in this DAG Covers the entirety of currently existing Spends if the DAG was built from Genesis Records errors in the new DAG branches if any Stops gathering after max_depth generations

source§

impl Client

source

pub async fn send_spends( &self, spend_requests: impl Iterator<Item = &SignedSpend>, verify_store: bool ) -> WalletResult<()>

Send spend requests to the network. This can optionally verify the spends have been correctly stored before returning

§Arguments
  • spend_requests - Iterator<SignedSpend>
  • verify_store - Boolean. Set to true for mandatory verification via a GET request through a Spend on the network.
§Example
use sn_client::{Client, WalletClient, Error};
use bls::SecretKey;
use sn_transfers::{HotWallet, MainSecretKey};
let client = Client::new(SecretKey::random(), None, None, None).await?;
let mut wallet = HotWallet::load_from_path(&tmp_path,Some(MainSecretKey::new(SecretKey::random())))?;
// An example of sending storage payment transfers over the network with validation
client.send_spends(wallet.unconfirmed_spend_requests().iter(),true).await?;
source

pub async fn receive( &self, transfer: &Transfer, wallet: &HotWallet ) -> WalletResult<Vec<CashNote>>

Receive a Transfer, verify and redeem CashNotes from the Network.

§Arguments
§Return Value
§Example
use sn_client::{Client, WalletClient, Error};
use bls::SecretKey;
use sn_transfers::{HotWallet, MainSecretKey};
use tracing::error;
use sn_transfers::Transfer;
let client = Client::new(SecretKey::random(), None, None, None).await?;
let mut wallet = HotWallet::load_from_path(&tmp_path,Some(MainSecretKey::new(SecretKey::random())))?;
let transfer = Transfer::from_hex("13abc").unwrap();
// An example for using client.receive() for cashNotes
let cash_notes = match client.receive(&transfer, &wallet).await {
                Ok(cash_notes) => cash_notes,
                Err(err) => {
                    println!("Failed to verify and redeem transfer: {err:?}");
                    error!("Failed to verify and redeem transfer: {err:?}");
                    return Err(err.into());
                }
            };
source

pub async fn verify_cashnote(&self, cash_note: &CashNote) -> WalletResult<()>

Verify that the spends referred to (in the CashNote) exist on the network.

§Arguments
§Return value

WalletResult

§Example
use sn_client::{Client, WalletClient, Error};
use bls::SecretKey;
use sn_transfers::{HotWallet, MainSecretKey};
use tracing::error;
use sn_transfers::Transfer;
let client = Client::new(SecretKey::random(), None, None, None).await?;
let mut wallet = HotWallet::load_from_path(&tmp_path,Some(MainSecretKey::new(SecretKey::random())))?;
let transfer = Transfer::from_hex("").unwrap();
let cash_notes = client.receive(&transfer, &wallet).await?;
// Verification:
for cash_note in cash_notes {
    println!("{:?}" , client.verify_cashnote(&cash_note).await.unwrap());
}

Trait Implementations§

source§

impl Clone for Client

source§

fn clone(&self) -> Client

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

§

impl Freeze for Client

§

impl !RefUnwindSafe for Client

§

impl Send for Client

§

impl Sync for Client

§

impl Unpin for Client

§

impl !UnwindSafe for Client

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

source§

fn implicit( self, class: Class, constructed: bool, tag: u32 ) -> TaggedParser<'a, Implicit, Self, E>

source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> Conv for T

source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
source§

impl<T> FmtForward for T

source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
source§

impl<D> OwoColorize for D

source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
source§

fn black<'a>(&'a self) -> FgColorDisplay<'a, Black, Self>

Change the foreground color to black
source§

fn on_black<'a>(&'a self) -> BgColorDisplay<'a, Black, Self>

Change the background color to black
source§

fn red<'a>(&'a self) -> FgColorDisplay<'a, Red, Self>

Change the foreground color to red
source§

fn on_red<'a>(&'a self) -> BgColorDisplay<'a, Red, Self>

Change the background color to red
source§

fn green<'a>(&'a self) -> FgColorDisplay<'a, Green, Self>

Change the foreground color to green
source§

fn on_green<'a>(&'a self) -> BgColorDisplay<'a, Green, Self>

Change the background color to green
source§

fn yellow<'a>(&'a self) -> FgColorDisplay<'a, Yellow, Self>

Change the foreground color to yellow
source§

fn on_yellow<'a>(&'a self) -> BgColorDisplay<'a, Yellow, Self>

Change the background color to yellow
source§

fn blue<'a>(&'a self) -> FgColorDisplay<'a, Blue, Self>

Change the foreground color to blue
source§

fn on_blue<'a>(&'a self) -> BgColorDisplay<'a, Blue, Self>

Change the background color to blue
source§

fn magenta<'a>(&'a self) -> FgColorDisplay<'a, Magenta, Self>

Change the foreground color to magenta
source§

fn on_magenta<'a>(&'a self) -> BgColorDisplay<'a, Magenta, Self>

Change the background color to magenta
source§

fn purple<'a>(&'a self) -> FgColorDisplay<'a, Magenta, Self>

Change the foreground color to purple
source§

fn on_purple<'a>(&'a self) -> BgColorDisplay<'a, Magenta, Self>

Change the background color to purple
source§

fn cyan<'a>(&'a self) -> FgColorDisplay<'a, Cyan, Self>

Change the foreground color to cyan
source§

fn on_cyan<'a>(&'a self) -> BgColorDisplay<'a, Cyan, Self>

Change the background color to cyan
source§

fn white<'a>(&'a self) -> FgColorDisplay<'a, White, Self>

Change the foreground color to white
source§

fn on_white<'a>(&'a self) -> BgColorDisplay<'a, White, Self>

Change the background color to white
source§

fn default_color<'a>(&'a self) -> FgColorDisplay<'a, Default, Self>

Change the foreground color to the terminal default
source§

fn on_default_color<'a>(&'a self) -> BgColorDisplay<'a, Default, Self>

Change the background color to the terminal default
source§

fn bright_black<'a>(&'a self) -> FgColorDisplay<'a, BrightBlack, Self>

Change the foreground color to bright black
source§

fn on_bright_black<'a>(&'a self) -> BgColorDisplay<'a, BrightBlack, Self>

Change the background color to bright black
source§

fn bright_red<'a>(&'a self) -> FgColorDisplay<'a, BrightRed, Self>

Change the foreground color to bright red
source§

fn on_bright_red<'a>(&'a self) -> BgColorDisplay<'a, BrightRed, Self>

Change the background color to bright red
source§

fn bright_green<'a>(&'a self) -> FgColorDisplay<'a, BrightGreen, Self>

Change the foreground color to bright green
source§

fn on_bright_green<'a>(&'a self) -> BgColorDisplay<'a, BrightGreen, Self>

Change the background color to bright green
source§

fn bright_yellow<'a>(&'a self) -> FgColorDisplay<'a, BrightYellow, Self>

Change the foreground color to bright yellow
source§

fn on_bright_yellow<'a>(&'a self) -> BgColorDisplay<'a, BrightYellow, Self>

Change the background color to bright yellow
source§

fn bright_blue<'a>(&'a self) -> FgColorDisplay<'a, BrightBlue, Self>

Change the foreground color to bright blue
source§

fn on_bright_blue<'a>(&'a self) -> BgColorDisplay<'a, BrightBlue, Self>

Change the background color to bright blue
source§

fn bright_magenta<'a>(&'a self) -> FgColorDisplay<'a, BrightMagenta, Self>

Change the foreground color to bright magenta
source§

fn on_bright_magenta<'a>(&'a self) -> BgColorDisplay<'a, BrightMagenta, Self>

Change the background color to bright magenta
source§

fn bright_purple<'a>(&'a self) -> FgColorDisplay<'a, BrightMagenta, Self>

Change the foreground color to bright purple
source§

fn on_bright_purple<'a>(&'a self) -> BgColorDisplay<'a, BrightMagenta, Self>

Change the background color to bright purple
source§

fn bright_cyan<'a>(&'a self) -> FgColorDisplay<'a, BrightCyan, Self>

Change the foreground color to bright cyan
source§

fn on_bright_cyan<'a>(&'a self) -> BgColorDisplay<'a, BrightCyan, Self>

Change the background color to bright cyan
source§

fn bright_white<'a>(&'a self) -> FgColorDisplay<'a, BrightWhite, Self>

Change the foreground color to bright white
source§

fn on_bright_white<'a>(&'a self) -> BgColorDisplay<'a, BrightWhite, Self>

Change the background color to bright white
source§

fn bold<'a>(&'a self) -> BoldDisplay<'a, Self>

Make the text bold
source§

fn dimmed<'a>(&'a self) -> DimDisplay<'a, Self>

Make the text dim
source§

fn italic<'a>(&'a self) -> ItalicDisplay<'a, Self>

Make the text italicized
source§

fn underline<'a>(&'a self) -> UnderlineDisplay<'a, Self>

Make the text italicized
Make the text blink
Make the text blink (but fast!)
source§

fn reversed<'a>(&'a self) -> ReversedDisplay<'a, Self>

Swap the foreground and background colors
source§

fn hidden<'a>(&'a self) -> HiddenDisplay<'a, Self>

Hide the text
source§

fn strikethrough<'a>(&'a self) -> StrikeThroughDisplay<'a, Self>

Cross out the text
source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
source§

impl<T> Pipe for T
where T: ?Sized,

source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> Tap for T

source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> TryConv for T

source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more