Trait tor_bytes::Readable

source ·
pub trait Readable: Sized {
    // Required method
    fn take_from(b: &mut Reader<'_>) -> Result<Self>;
}
Expand description

Trait for an object that can be extracted from a Reader.

Implement this trait in order to make an object that can (maybe) be decoded from a reader. Most code won’t need to call this directly, but will instead use it implicitly via the Reader::extract() method.

§Example

use tor_bytes::{Readable,Reader,Result};
#[derive(Debug, Eq, PartialEq)]
struct Message {
  flags: u32,
  cmd: u8
}

impl Readable for Message {
    fn take_from(r: &mut Reader<'_>) -> Result<Self> {
        // A "Message" is encoded as flags, then command.
        let flags = r.take_u32()?;
        let cmd = r.take_u8()?;
        Ok(Message{ flags, cmd })
    }
}

let encoded = [0x00, 0x00, 0x00, 0x43, 0x07 ];
let mut reader = Reader::from_slice(&encoded);
let m: Message = reader.extract()?;
assert_eq!(m, Message { flags: 0x43, cmd: 0x07 });
reader.should_be_exhausted()?; // make sure there are no bytes left over

Required Methods§

source

fn take_from(b: &mut Reader<'_>) -> Result<Self>

Try to extract an object of this type from a Reader.

Implementations should generally try to be efficient: this is not the right place to check signatures or perform expensive operations. If you have an object that must not be used until it is finally validated, consider making this function return a wrapped type that can be unwrapped later on once it gets checked.

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

source§

impl Readable for u8

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl Readable for u16

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl Readable for u32

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl Readable for u64

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl Readable for u128

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl Readable for Ipv4Addr

source§

fn take_from(r: &mut Reader<'_>) -> Result<Self>

source§

impl Readable for Ipv6Addr

source§

fn take_from(r: &mut Reader<'_>) -> Result<Self>

source§

impl Readable for PublicKey

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl Readable for Signature

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl Readable for Ed25519Identity

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl Readable for RsaIdentity

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl Readable for PublicKey

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl<N> Readable for GenericArray<u8, N>
where N: ArrayLength<u8>,

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl<T: OutputSizeUser> Readable for CtOutput<T>

source§

fn take_from(b: &mut Reader<'_>) -> Result<Self>

source§

impl<const N: usize> Readable for CtByteArray<N>

source§

fn take_from(r: &mut Reader<'_>) -> Result<Self>

source§

impl<const N: usize> Readable for [u8; N]

source§

fn take_from(r: &mut Reader<'_>) -> Result<Self>

Implementors§