Вопрос по трейтам

Хотел тут проделать примерно то что увидел в byteorder:

pub trait Ordered{
    fn read_u16(buf: &[u8]) -> u16;
}

pub enum LittleEndian {}

impl Ordered for LittleEndian{
    fn read_u16(buf: &[u8]) -> u16{
        read_num_bytes!(u16, 2, buf, to_le)
    }
}

pub trait OrderedRead: Read {
    #[inline]
    fn read_u16<T: Ordered>(&mut self) -> Result<u16, IoError> {
        let mut buf = [0; 2];
        self.read_exact(&mut buf)?;
        Ok(T::read_u16(&buf))
    }
}

impl<R: Read> OrderedRead for R {}

В принципе всё вроде нормально:

fn test_1()->Result<u16,IoError>{
    let fname = "test.txt";
    let mut reader = io::BufReader::new(File::open(&fname)?);
    Ok(reader.read_u16::<LittleEndian>()?)
}

А вот как сделать так, чтобы можно было работать по ссылке?
Что-то типа такого:

fn test_3(r: &Read)->Result<u16,IoError>{
	// error[E0599]: no method named `read_u16` found for type `&dyn std::io::Read` in the current scope;
	Ok(r.read_u16::<LittleEndian>()?)
}

Конечно, можно через бокс заюзать:

fn test_2(r: Box<dyn Read>)->Result<u16,IoError>{
	Ok(r.read_u16::<BigEndian>()?)
}

Но возможно ли через ссылку?

UPD.
А, нет, отбой тревоги.
Всё решил.
Просто забыл про impl Trait:

fn test_3( r: &mut impl Read ) ->Result<u16,IoError> {
	Ok(r.read_u16::<LittleEndian>()?)
}

UPD2.
Нельзя ночью код писать.
Забыть добавить mut и удивляться почему метод не найден.

fn test_3( mut r: &mut Read)->Result<u16,IoError>{
	Ok(r.read_u16::<LittleEndian>()?)
}

Сами спросили, сами ответили. Я даже умилился :slight_smile:. Эх, всегда бы так.