scroll::ctx

Trait TryFromCtx

Source
pub trait TryFromCtx<'a, Ctx: Copy = (), This: ?Sized = [u8]>
where Self: 'a + Sized,
{ type Error; // Required method fn try_from_ctx( from: &'a This, ctx: Ctx, ) -> Result<(Self, usize), Self::Error>; }
Expand description

Tries to read Self from This using the context Ctx

§Implementing Your Own Reader

If you want to implement your own reader for a type Foo from some kind of buffer (say [u8]), then you need to implement this trait

use scroll::{self, ctx, Pread};
#[derive(Debug, PartialEq, Eq)]
pub struct Foo(u16);

impl<'a> ctx::TryFromCtx<'a, scroll::Endian> for Foo {
     type Error = scroll::Error;
     fn try_from_ctx(this: &'a [u8], le: scroll::Endian) -> Result<(Self, usize), Self::Error> {
         if this.len() < 2 { return Err((scroll::Error::Custom("whatever".to_string())).into()) }
         let n = this.pread_with(0, le)?;
         Ok((Foo(n), 2))
     }
}

let bytes: [u8; 4] = [0xde, 0xad, 0, 0];
let foo = bytes.pread_with::<Foo>(0, scroll::LE).unwrap();
assert_eq!(Foo(0xadde), foo);

let foo2 = bytes.pread_with::<Foo>(0, scroll::BE).unwrap();
assert_eq!(Foo(0xdeadu16), foo2);

§Advanced: Using Your Own Error in TryFromCtx

 use scroll::{self, ctx, Pread};
 use std::error;
 use std::fmt::{self, Display};
 // make some kind of normal error which also can transformed from a scroll error
 #[derive(Debug)]
 pub struct ExternalError {}

 impl Display for ExternalError {
     fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
         write!(fmt, "ExternalError")
     }
 }

 impl error::Error for ExternalError {
     fn description(&self) -> &str {
         "ExternalError"
     }
     fn cause(&self) -> Option<&dyn error::Error> { None}
 }

 impl From<scroll::Error> for ExternalError {
     fn from(err: scroll::Error) -> Self {
         match err {
             _ => ExternalError{},
         }
     }
 }
 #[derive(Debug, PartialEq, Eq)]
 pub struct Foo(u16);

 impl<'a> ctx::TryFromCtx<'a, scroll::Endian> for Foo {
     type Error = ExternalError;
     fn try_from_ctx(this: &'a [u8], le: scroll::Endian) -> Result<(Self, usize), Self::Error> {
         if this.len() <= 2 { return Err((ExternalError {}).into()) }
         let offset = &mut 0;
         let n = this.gread_with(offset, le)?;
         Ok((Foo(n), *offset))
     }
 }

let bytes: [u8; 4] = [0xde, 0xad, 0, 0];
let foo: Result<Foo, ExternalError> = bytes.pread(0);

Required Associated Types§

Required Methods§

Source

fn try_from_ctx(from: &'a This, ctx: Ctx) -> Result<(Self, usize), Self::Error>

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<'a> TryFromCtx<'a> for &'a CStr

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], _ctx: ()) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a> for CString

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], _ctx: ()) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for f32
where f32: FromCtx<Endian>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for f64
where f64: FromCtx<Endian>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for i8
where i8: FromCtx<Endian>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for i16
where i16: FromCtx<Endian>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for i32
where i32: FromCtx<Endian>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for i64
where i64: FromCtx<Endian>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for i128

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for u8
where u8: FromCtx<Endian>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for u16
where u16: FromCtx<Endian>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for u32
where u32: FromCtx<Endian>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for u64
where u64: FromCtx<Endian>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, Endian> for u128

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a [u8], le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a> TryFromCtx<'a, StrCtx> for &'a str

Source§

fn try_from_ctx( src: &'a [u8], ctx: StrCtx, ) -> Result<(Self, usize), Self::Error>

Read a &str from src using delimiter

Source§

type Error = Error

Source§

impl<'a> TryFromCtx<'a, usize> for &'a [u8]

Source§

type Error = Error

Source§

fn try_from_ctx( src: &'a [u8], size: usize, ) -> Result<(Self, usize), Self::Error>

Source§

impl<'a, T> TryFromCtx<'a, Endian, T> for i8
where i8: FromCtx<Endian, T>, T: AsRef<[u8]>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a T, le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a, T> TryFromCtx<'a, Endian, T> for i16
where i16: FromCtx<Endian, T>, T: AsRef<[u8]>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a T, le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a, T> TryFromCtx<'a, Endian, T> for i32
where i32: FromCtx<Endian, T>, T: AsRef<[u8]>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a T, le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a, T> TryFromCtx<'a, Endian, T> for i64
where i64: FromCtx<Endian, T>, T: AsRef<[u8]>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a T, le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a, T> TryFromCtx<'a, Endian, T> for i128
where i128: FromCtx<Endian, T>, T: AsRef<[u8]>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a T, le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a, T> TryFromCtx<'a, Endian, T> for u8
where u8: FromCtx<Endian, T>, T: AsRef<[u8]>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a T, le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a, T> TryFromCtx<'a, Endian, T> for u16
where u16: FromCtx<Endian, T>, T: AsRef<[u8]>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a T, le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a, T> TryFromCtx<'a, Endian, T> for u32
where u32: FromCtx<Endian, T>, T: AsRef<[u8]>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a T, le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a, T> TryFromCtx<'a, Endian, T> for u64
where u64: FromCtx<Endian, T>, T: AsRef<[u8]>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a T, le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a, T> TryFromCtx<'a, Endian, T> for u128
where u128: FromCtx<Endian, T>, T: AsRef<[u8]>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a T, le: Endian) -> Result<(Self, usize), Self::Error>

Source§

impl<'a, T> TryFromCtx<'a, StrCtx, T> for &'a str
where T: AsRef<[u8]>,

Source§

type Error = Error

Source§

fn try_from_ctx(src: &'a T, ctx: StrCtx) -> Result<(Self, usize), Self::Error>

Implementors§